关于【自动下载阿里云RDS数据库备份】计划任务执行报错修复

前段时间写了一个利用aliyun提供的RDS备份下载工具python接口工具写了一个shell脚本,文章地址:http://opensgalaxy.com/2015/09/23/shell实战【自动下载阿里云rds数据库备份】/ ,没看过的可以先看一下。
来批量下载阿里云上的RDS备份,但考虑到不可能每次手动去下载这些备份(太累),于是顺其自然的就把脚本加入到了计划任务,每天22点执行它,这下问题来了,第二天发现备份没有下载成功,于是查看了一下日志,竟是如下报错:

问题一:

[root@puppetmaster rdsget]# cat getrds.log 
decode() argument 1 must be string, not None
decode() argument 1 must be string, not None
decode() argument 1 must be string, not None
decode() argument 1 must be string, not None
decode() argument 1 must be string, not None
decode() argument 1 must be string, not None
decode() argument 1 must be string, not None
decode() argument 1 must be string, not None
decode() argument 1 must be string, not None
......

这是哪的编码不对呢。。。于是查找资料
还好有人碰到过同样的问题,更巧的是也是aliyun提供的接口工具报同样的错误,

解决办法:

原文地址:http://bbs.aliyun.com/read/251702.html?pos=7
日志中记录的执行报错信息:decode() argument 1 must be string, not None
这个信息是在接口脚本:aliyun/api/base.py引发的
引发的相关代码:

def percent_encode(encodeStr): 
    encodeStr = str(encodeStr) 
    res = urllib.quote(encodeStr.decode(sys.stdin.encoding).encode('utf8'), '') 
    res = res.replace('+', '%20') 
    res = res.replace('*', '%2A') 
    res = res.replace('%7E', '~') 
    return res 

具体是出在sys.stdin.encoding,
备注:
终端的输入编码:sys.stdin.encoding终端的输出编码:sys.stdout.encoding
用任务计划自动执行的时候,就不涉及终端输入了,结果就报错了
我把sys.stdin.encoding去掉了,系统crontab执行就正常了
修改后的代码:

def percent_encode(encodeStr): 
    encodeStr = str(encodeStr) 
   res = urllib.quote(encodeStr.encode('utf8'), '') 
    #res = urllib.quote(encodeStr.decode(sys.stdin.encoding).encode('utf8'), '') 
    res = res.replace('+', '%20') 
    res = res.replace('*', '%2A') 
    res = res.replace('%7E', '~') 
    return res 

这个解决完了,果然不报这个错了,但是新问题又来了,日志报错内容如下:

问题二:

'ascii' codec can't encode character u'\u4ece' in position 0: ordinal not in range(128)
[]
'ascii' codec can't encode character u'\u4ece' in position 0: ordinal not in range(128)
[]
'ascii' codec can't encode character u'\u4ece' in position 0: ordinal not in range(128)
[]
'ascii' codec can't encode character u'\u4ece' in position 0: ordinal not in range(128)
[]
'ascii' codec can't encode character u'\u4ece' in position 0: ordinal not in range(128)
[]
'ascii' codec can't encode character u'\u4ece' in position 0: ordinal not in range(128)
[]
'ascii' codec can't encode character u'\u4ece' in position 0: ordinal not in range(128)
[]
'ascii' codec can't encode character u'\u4ece' in position 0: ordinal not in range(128)

解决方法:

原文地址:http://blog.csdn.net/xiaokang06/article/details/8229061
标题:Python编码错误处理

在将字符串写入文件时,执行f.write(str),后台总是报错:UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\u6211′ in position 0: ordinal not in range(128),即ascii码无法被转换成unicode码。刚开始我以为python默认的编码是utf-8,所以使用decode方法和encode方法来进行编码转换,后来怎么也不成功,于是怀疑是否默认编码不是utf-8。使用下面语句获取python当前的默认编码:

import sys  
print sys.getdefaultencoding()  

这是输出的结果是ascii。所以我安装的python默认编码是ascii。那么下一步,如何来改变python的默认编码呢?如下有两种方式:

方式一:在python代码中进行改变,代码如下:

import sys  
reload(sys)  
sys.setdefaultencoding('utf-8')   

方式二:python安装目录下的lib\site-packages文件夹下新建一个sitecustomize.py,文件中的代码为:

import sys  
sys.setdefaultencoding('utf-8')   

我选择了方式一,在getfile.py脚本中加入

reload(sys)  
sys.setdefaultencoding('utf-8')  

问题解决,至此解决了任务计划调度下载阿里云RDS备份shell脚本的问题,以上两个问题解决方法均来自网友,我这里做一个整理汇总,分享给大家。

发表评论