UnicodeEncodeError仅在管道传输到文件时且仅在某些PC上

时间:2016-03-13 00:00:07

标签: python unicode utf-8

很多人都有这个问题,但提出的解决方案对我没有帮助。

在我的ubuntu机器上,脚本运行没有错误。但是在我的raspi上不断出现这个错误:

UnicodeEncodeError: 'ascii' codec can't encode character '\xd6' in position 21: ordinal not in range(128)

错误提示德语字符(变音符号,ö)应使用print(a_name)

打印

令我困惑的是:在致电 python3 myscript.py 时,我在raspi上没有任何错误。但是通过电话python3 myscript.py > output ,我收到了错误消息。与nohup python3 myscript.py或从crontab运行时相同:

@reboot LANG=de_DE.UTF-8 /home/pi/launcher.sh > /home/pi/bot/logs/cronlog 2>&1

其中 launcher.sh 使用以下代码:

python3 myscript.py > pythonlog 2>&1

我查看了 $ LANG

在我的ubuntu pc上(我没有收到任何错误): en_US.UTF-8

on raspi: de_DE.UTF-8

为什么我收到此错误消息,如何摆脱它?

2 个答案:

答案 0 :(得分:5)

您是否尝试过设置环境变量PYTHONIOENCODING

export PYTHONIOENCODING=UTF-8
python3 myscript.py > pythonlog 2>&1

答案 1 :(得分:3)

在正常情况下,Python使用区域设置来计算要应用于stdout的编码。

当Python没有交互式会话时,即当输入或输出通过管道传输或重定向时,Python在stdout和stdin上默认为“ASCII”编码。

要覆盖此行为,请使用PYTHONIOENCODING环境变量设置适当的输入/输出编码。 E.g。

PYTHONIOENCODING=utf-8 echo "test €3.20" | myscript.py > output.txt