手工执行python3程序没问题,放在cron里面就不执行有中文的代码,高手帮忙啊。急!

「已注销」 2012-01-18 11:01:33
先介绍下基本情况

环境: redhat Python3.2
目的:定时执行python程序
问题:手工执行python程序没有问题,放到crontab列表里面执行的时候,遇到中文就抛异常

python程序源码
#!/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()


手工执行结果:
[kkk@vs ~]$ python3 /home/kkk/9/app/tw/tw3.py
a

b


放到cron里面
[kkk@vs ~]$ crontab -l
*/1 * * * * /usr/local/bin/python3 /home/kkk/9/app/tw/tw3.py > cronlog5

查看日志,只有a被打印了
[kkk@vs ~]$ more cronlog5
a
Exception: 'ascii' codec can't encode character '\u4e2d' in position 0: ordinal not in range(128)


已经尝试过网上使用的添加sitecustomize.py文件方法,不起作用

也试过
import sys 
reload(sys)
sys.setdefaultencoding('utf8')

结果sys.setdefaultencoding('utf8')后面的代码就不执行了,日志里面只有这条语句前面的打印记录

查看python3默认编码,发现已经是utf-8,也许是上面两种方法不再有效的原因
另外系统里面还有python2,不过我想跟这个也许没什么关系,之前被我执行过sys.setdefaultencoding('utf8') ,现在默认编码也是utf-8了

[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'
>>>


被这个问题折腾一天了,请大虾们帮我看看。
...全文
245 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
iambic 2012-01-19
  • 打赏
  • 举报
回复
还是没搞明白是哪个地方设置不对。是filesystemencoding还是哪里。
「已注销」 2012-01-19
  • 打赏
  • 举报
回复
解决了,谢谢。
方法如下:

[kkk@vs ~]$ crontab -l
*/1 * * * * export LANG="en_US.UTF-8"; /usr/local/bin/python3 /home/kkk/9/app/tw/tw3.py > cronlog5
iambic 2012-01-19
  • 打赏
  • 举报
回复
不清楚python3是用的什么来确定编码。你要是着急可以直接在python代码里写文件,而不是打印到标准输出再重定向到文件。
「已注销」 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 iambic 的回复:]
引用 2 楼 qianglee 的回复:
[kkk@vs ~]$ more cronlog8
utf-8
x
Exception: 'ascii' codec can't encode character '\u4e2d' in position 0: ordinal not in range(128)

x是哪里来的?
[/Quote]

本来是个a,我临时改了下代码,让他显示不同一点,以示区别,后来又改回打印a了

iambic 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qianglee 的回复:]
[kkk@vs ~]$ more cronlog8
utf-8
x
Exception: 'ascii' codec can't encode character '\u4e2d' in position 0: ordinal not in range(128)
[/Quote]
x是哪里来的?
「已注销」 2012-01-19
  • 打赏
  • 举报
回复
这样改没错吧,系统编码已经是utf-8了

「已注销」 2012-01-19
  • 打赏
  • 举报
回复
代码改成这样
#!/usr/local/bin/python3
#coding=gbk

import io, sys, time, re, os
import locale

def main():
try:
defEnco = sys.getdefaultencoding()
print(defEnco)
print("a")
print("中")
print("b")
except Exception as e:
print("Exception: " + str(e))

if __name__ == '__main__':
main()


执行结果:

[kkk@vs ~]$ more cronlog8
utf-8
x
Exception: 'ascii' codec can't encode character '\u4e2d' in position 0: ordinal not in range(128)
[kkk@vs ~]$

查看系统编码
[kkk@vs ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
[kkk@vs ~]$
iambic 2012-01-19
  • 打赏
  • 举报
回复
你在shell里看不管用,因为你手动执行没错。你在cron的task里把encoding打出来看下。可能是执行这个task的环境(或者用户)的默认编码不是utf-8的。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧