Python unicode popen 或 Popen 读取 unicode 时出错
我有一个程序可以生成以下输出:
┌───────────────────────┐
│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 开始
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
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
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.
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│
└───────────────────────┘
>>>
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)
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我想说从控制台运行程序应该可以正常工作,因为 Python 可以猜测终端窗口的控制台编码(美国 Windows 上的 cp437),但是当通过管道运行时,Python 使用默认的 ascii。尝试更改您的程序,将所有 Unicode 输出
编码
为显式编码,例如:print (upper_line * len).encode('cp437')
然后,当您从管道读取它时,您可以 < code>decode 返回 Unicode 或直接打印到终端。
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:print (upper_line * len).encode('cp437')
Then when you read it from the pipe, you can either
decode
back to Unicode or print it directly to the terminal.