Python unicode popen或Popen错误读取unicode [英] Python unicode popen or Popen error reading unicode

查看:192
本文介绍了Python unicode popen或Popen错误读取unicode的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a program that generates the following output:

             ┌───────────────────────┐
             │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错误.

This doesn't seem to format right on this site, but the lower lines at the top and the upper lines at the bottom result in a unicode error.

这是os.popen的代码示例

Here is the code example for 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│
             └───────────────────────┘

>>> 

这与子流程相同.Popen:

Here is the same for 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开始

Any ideas if this can be made to work without a lot of "under the hood" work? I'm just learning programming and starting with python

推荐答案

我说从控制台运行程序应该可以正常工作,因为Python可以猜测终端窗口的控制台编码(在美国Windows中为cp437),但是当通过管道运行Python使用默认的ascii.尝试将您的程序更改为将所有Unicode输出encode转换为显式编码,例如:

I'd say running your program from the console should work correctly because Python can guess the console encoding of the terminal window (cp437 on US Windows), but when run through a pipe Python uses the default of ascii. Try changing your program to encode all Unicode output to an explicit encoding, such as:

打印(upper_line * len).encode('cp437')

print (upper_line * len).encode('cp437')

然后,当您从管道读取它时,您可以decode回到Unicode或直接将其打印到终端上.

Then when you read it from the pipe, you can either decode back to Unicode or print it directly to the terminal.

这篇关于Python unicode popen或Popen错误读取unicode的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆