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

Mat*_*boz 4 python bash encoding invocation

像一个简单的文件

$ cat x.py
x = u'Gen\xe8ve'
print x
Run Code Online (Sandbox Code Playgroud)

跑步时会给我:

$ python x.py
Genève
Run Code Online (Sandbox Code Playgroud)

但是,当作为"命令替换"运行时,将给出:

$ echo $(python x.py)
...
UnicodeEncodeError: 'ascii' codec...
Run Code Online (Sandbox Code Playgroud)

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

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

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

San*_*dri 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)
Run Code Online (Sandbox Code Playgroud)

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

x = u'Gen\xe8ve'.encode('utf-8') 
print x
Run Code Online (Sandbox Code Playgroud)

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

$echo $(python x.py)
Genève
$python x.py 
Genève
Run Code Online (Sandbox Code Playgroud)