先介绍下基本情况
环境: redhat Python3.2
目的:定时执行python程序
问题:手工执行python程序没有问题,放到crontab列表里面执行的时候,遇到中文就抛异常
python程序源码
- Python code
#!/usr/local/bin/python3 #coding=gbk import io, sys, time, re, os def main(): try: print("a") print("中") print("b") except Exception as e: print("Exception: " + str(e)) if __name__ == '__main__': main()
手工执行结果:
- Perl code
[kkk@vs ~]$ python3 /home/kkk/9/app/tw/tw3.py a 中 b
放到cron里面
- Perl code
[kkk@vs ~]$ crontab -l */1 * * * * /usr/local/bin/python3 /home/kkk/9/app/tw/tw3.py > cronlog5
查看日志,只有a被打印了
- Perl code
[kkk@vs ~]$ more cronlog5 a Exception: 'ascii' codec can't encode character '\u4e2d' in position 0: ordinal not in range(128)
已经尝试过网上使用的添加sitecustomize.py文件方法,不起作用
也试过
- Python code
import sys reload(sys) sys.setdefaultencoding('utf8')
结果sys.setdefaultencoding('utf8')后面的代码就不执行了,日志里面只有这条语句前面的打印记录
查看python3默认编码,发现已经是utf-8,也许是上面两种方法不再有效的原因
另外系统里面还有python2,不过我想跟这个也许没什么关系,之前被我执行过sys.setdefaultencoding('utf8') ,现在默认编码也是utf-8了
- Perl code
[kkk@vs ~]$ python Python 2.4.3 (#1, Sep 21 2011, 20:06:00) [GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.getdefaultencoding() 'utf-8' >>>
被这个问题折腾一天了,请大虾们帮我看看。
------解决方案--------------------
你在shell里看不管用,因为你手动执行没错。你在cron的task里把encoding打出来看下。可能是执行这个task的环境(或者用户)的默认编码不是utf-8的。