2017-04-03 48 views
0

我有一个Python脚本调用a.py:Python脚本打印unicode的,在外壳使用``导致错误

#!/usr/bin/python2.7 
# -*- coding: utf-8 -*- 
print u'' 

在这两个bash和tcsh中:

$ a.py 
Ô£øÔ£øÔ£øÔ£ø 
$ echo `a.py` 
Traceback (most recent call last): 
    File "a.py", line 3, in <module> 
    print u'Ô£øÔ£øÔ£øÔ£ø' 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) 

错误是来自Python,而不是shell。如何在反引号下运行脚本会影响脚本本身?请注意,如果在脚本的开头将解释器切换到Python 3,这不是问题。

回答

5

当Python没有检测到它正在打印到终端时,就像在子shell中一样,sys.stdout.encoding设置为None。当你打印一个unicode时,使用ascii编解码器(至少在Python2中)。如果unicode包含0-127之外的代码点,将导致UnicodeError。

解决此问题的一种方法是将PYTHONIOENCODING环境变量设置为适当的编码。例如:

export PYTHONIOENCODING=utf-8; echo `a.py` 

学分此去unutbu

+0

哇。我从来不会想到这一点。所以我试着把它添加到a.py中:import os os.putenv('PYTHONIOENCODING','utf-8') 但这不起作用。可能我对bash缺乏经验(我主要使用tcsh),但我不明白你的解决方案为什么可行,但这不是。 –