Python打印语句使用UTF-8编码并且使用nohup命令

17

我有一些打印日志信息的Python代码。在命令行下运行时,使用utf-8没有问题。包含特殊字符的日志消息可以正常打印。但是,在后台使用nohup运行时,它会无法处理utf-8字符。

nohup python2.7 myProgram.py &

我看到的错误是通常的“试图在ASCII中编码utf”的错误:
UnicodeEncodeError:'ascii'编解码器无法在位置71处对字符u'\u2013'进行编码:超出范围128。
我猜这是因为nohup向python信号表示它没有普通终端,所以默认为ascii。有没有办法告诉nohup启用utf-8或设置utf-8字符在后台运行nohup时不会导致崩溃?

你的文件中有编码头吗?# -*- encoding: utf8 -*- 是否在文件的第一行或第二行。 - Andrea Spadaccini
发布你的脚本,特别是前几行和一些失败的日志消息示例。 - pajton
另一个选择是使用“screen”而不是“nohup”。http://serverfault.com/a/311602/10905 - Liran Orevi
1个回答

23
使用PYTHONIOENCODING
export PYTHONIOENCODING=utf-8
nohup python2.7 myProgram.py &

例如,如果

myProgram.py:

unicode_obj=u'\N{INFINITY}'
print(unicode_obj)    

然后运行

nohup python2.7 myProgram.py > /tmp/test &

产生

/tmp/test:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u221e' in position 0: ordinal not in range(128)

export PYTHONIOENCODING=utf-8
nohup python2.7 myProgram.py > /tmp/test &

产生

/tmp/test:


太棒了!谢谢!我花了很长时间查看LC_*环境变量,我不知道它必须是Python特定的。太好了。 - Ernst
因为脚本中应正确处理编码(即将Unicode字符串编码为预期的编码,并将其写入标准输出),所以我很想给你点个踩。 - Arafangion
@Arafangion: 用于重定向的文件的预期编码是什么? - jfs
@J.F.Sebastian:我不知道 - 那是你的工作。(提示:在我的系统上,我倾向于使用UTF-8,但其他人和其他系统有不同的编码方式),即使如此,如果您的Python字符串中有非UTF-8编码的数据,您的答案仍然是错误的,您的答案只影响用于Unicode->字符串转换的默认编码。 - Arafangion
我已经在几个脚本中设置并导出了该环境变量 (PYTHONIOENCODING=utf-8),但它并没有解决那个错误。最终,代码中还有需要解决的问题。 - edoceo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接