Python中unicode popen或Popen读取unicode时出现错误

4

我有一个生成以下输出的程序:

             ┌───────────────────────┐
             │10 day weather forecast│
             └───────────────────────┘
▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
Tonight Sep 27      Clear               54      0 %
Tue Sep 28          Sunny               85/61   0 %
Wed Sep 29          Sunny               86/62   0 %
Thu Sep 30          Sunny               87/65   0 %
Fri Oct 01          Sunny               85/62   0 %
Sat Oct 02          Sunny               81/59   0 %
Sun Oct 03          Sunny               79/56   0 %
Mon Oct 04          Sunny               78/58   0 %
Tue Oct 05          Sunny               81/61   0 %
Wed Oct 06          Sunny               81/61   0 %

Last Updated Sep 27 10:20 p.m. CT
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔

这段文字在这个网站上似乎无法正确格式化,但是顶部的下面一行和底部的上面一行会导致 Unicode 错误。
以下是 os.popen 的代码示例。
>>> buffer = popen('10day', 'r').read()
Traceback (most recent call last):
  File "/home/woodnt/python/10_day_forecast.py", line 129, in <module>
    line_lower(51)
  File "/home/woodnt/python/lib/box.py", line 24, in line_lower
    print upper_line * len
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-50: ordinal not in range(128)
>>> print buffer

             ┌───────────────────────┐
             │10 day weather forecast│
             └───────────────────────┘

>>> 

对于 subprocess.Popen,用法类似:

f = Popen('10day', stdout=PIPE, stdin=PIPE, stderr=PIPE)
o, er = f.communicate()
print o

             ┌───────────────────────┐
             │10 day weather forecast│
             └───────────────────────┘

print er
Traceback (most recent call last):
  File "/home/woodnt/python/10_day_forecast.py", line 129, in <module>
    line_lower(51)
  File "/home/woodnt/python/lib/box.py", line 24, in line_lower
    print upper_line * len
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-50: ordinal not in range(128)

有没有什么想法,可以在不需要大量“底层”工作的情况下使其正常工作?我正在学习编程,并从Python开始。


不知道为什么上面的格式会出现这么多问题。我很抱歉。 - narnie
1个回答

2
我认为从控制台运行程序应该可以正常工作,因为Python可以猜测终端窗口的控制台编码(cp437在美国Windows上),但是通过管道运行时,Python使用默认的ascii编码。尝试将程序更改为将所有Unicode输出编码为明确的编码,例如: print (upper_line * len).encode('cp437')
然后当您从管道中读取它时,您可以将其解码回Unicode或直接打印到终端。

不幸的是,它在控制台上出现了问题。从Python控制台开始执行popen时,就会出现问题。我认为你对管道默认为ASCII的看法是正确的。猜测没有办法改变这种行为。太糟糕了。按照你的建议去尝试是个好主意。我会试一试的。 - narnie
那就做到了。感谢你提供一个绝佳的解决方案。我猜如果这是另一个没有源代码只有二进制文件的程序,就没有办法绕过这个问题了,对吧? - narnie
3
当源程序为Python时,在Popen之前,您可以使用os.environ['PYTHONIOENCODING'] = 'utf-8'。该环境变量指示Python使用UTF-8作为默认编码而不是ASCII码。所有Unicode字符都可以使用此编码发送...只需对接收到的输出进行.decode('utf-8')处理就可以将其转换回Unicode。 - Mark Tolonen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接