我正在运行./sample.py --url http://blah.com
但没有错误,但是如果我运行./sample.py --url http://blah.com | wc -l
或类似我收到错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u200f' in position 0: ordinal not in range(128)
如何使python脚本与我的终端命令兼容?我一直看到sys.stdin.isatty
的引用,尽管它的用例似乎正好相反。
答案 0 :(得分:5)
当Python检测到它正在打印到终端时,sys.stdout.encoding
被设置为终端的编码。当您print
unicode
时,unicode
会使用str
编码为sys.stdout.encoding
。
当Python未检测到它正在打印到终端时,sys.stdout.encoding
设置为None
。当您print
unicode
时,会使用ascii
编解码器(至少在Python2中)。如果unicode
包含0-127之外的代码点,则会导致UnicodeError。
解决此问题的一种方法是在打印前对unicode
进行显式编码。这也许是正确的方法,但如果你周围散布着很多印刷语句,那就太费力了。
解决此问题的另一种方法是将PYTHONIOENCODING环境变量设置为适当的编码。例如,
PYTHONIOENCODING=utf-8
然后在将输出打印到文件时,将使用此编码而不是ascii
。
有关详细信息,请参阅PrintFails wiki page。
答案 1 :(得分:-1)
尝试:
(./sample.py --url http://blah.com) | wc -l
这会生成一个子shell来运行你的python脚本,然后将输出从stdout
传递到wc