python脚本的管道输出

时间:2012-11-20 20:30:15

标签: python terminal piping

我正在运行./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的引用,尽管它的用例似乎正好相反。

2 个答案:

答案 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