2017-04-03 50 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),但我不明白你的解決方案爲什麼可行,但這不是。 –