仅当作为外部进程调用时,python编码错误

仅当作为外部进程调用时,python编码错误,python,bash,encoding,invocation,Python,Bash,Encoding,Invocation,像这样的简单文件 $ cat x.py x = u'Gen\xe8ve' print x 当run将为我提供: $ python x.py Genève 但是,当作为“命令替换”运行时,将给出: $ echo $(python x.py) ... UnicodeEncodeError: 'ascii' codec... 我尝试过使用不同的终端模拟器(xterm、gnome术语)和ttyS上的控制台。用bash和sh,用python2.4和2.7。 在运行python之前,我尝试将LC_AL

像这样的简单文件

$ cat x.py
x = u'Gen\xe8ve'
print x
当run将为我提供:

$ python x.py
Genève
但是,当作为“命令替换”运行时,将给出:

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

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

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

正如您所怀疑的,当Python的标准输出不是已知的终端时,它不知道如何打印unicode。考虑在打印之前对字符串进行编码:

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

请注意,调用程序和脚本需要在通用编码中保持一致。

这里的问题是,在第二次调用中,您基本上是在向只接受ByTestRing(类似文件的对象)的管道写入数据。如果尝试执行以下操作,也会发生同样的情况:

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)
这将打印编码为utf-8 bytestring(字节序列)的unicode字符串,允许将其写入类似文件的对象

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

好啊我完全可以重现这一点。通常终端也只接受ByTestRing(在Windows上,它可能直接接受Unicode)。区别在于Python是否知道适当的字符编码或默认为ascii
$echo $(python x.py)
Genève
$python x.py 
Genève