python编码错误仅在被调用为外部进程时

时间:2012-08-07 11:20:32

标签: python bash encoding invocation

这样的简单文件
$ cat x.py
x = u'Gen\xe8ve'
print x

跑步时会给我:

$ python x.py
Genève

然而,当作为“命令替换”运行时,将给出:

$ echo $(python x.py)
...
UnicodeEncodeError: 'ascii' codec...

我尝试过使用不同的终端模拟器(xterm,gnome-term)和ttyS上的控制台。用bash和sh。用python2.4和2.7。 在运行python之前,我已经尝试将LC_ALL或LANG设置为某些utf-8语言环境。 我检查了sys.getdefaultencoding()。 没有任何帮助。

当从另一个进程(如java)调用脚本时也会出现问题,但上面是我发现复制它的最简单方法。

我不明白这两个电话之间有什么区别。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:7)

这里的问题是,在第二次调用中,您基本上是在写一个只接受字节串​​(类文件对象)的管道。如果您尝试执行此操作,也会发生同样的情况:

python x.py > my_file
Traceback (most recent call last):
File "x.py", line 2, in <module>
    print x
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe8' in position 3: ordinal not in range(128)

由于接收器只能理解字节串而不是unicode字符,因此必须首先使用encode函数将unicode字符串编码为字节串:

x = u'Gen\xe8ve'.encode('utf-8') 
print x

这将打印编码为utf-8字节字符串(字节序列)的unicode字符串,允许将其写入类似文件的对象。

$echo $(python x.py)
Genève
$python x.py 
Genève

答案 1 :(得分:2)

如您所料,当标准输出不是已知终端时,Python不知道如何打印unicode。在打印之前考虑编码字符串:

# coding: utf-8
x = u'Gen\xe8ve'
print x.encode("utf-8")

请注意,调用程序和脚本需要以通用编码达成一致。