在powershell中处理python3unicode输出可以干净地完成吗?

2024-09-27 21:33:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的python脚本foo.py,它输出一个unicode字符:

import sys
print(sys.stdout.encoding)
print(b'\xe2\x96\x88'.decode('utf8'))

我想在powershell中运行它,并通过管道将输出发送到写入主机:

PS> c:\python37\python.exe foo.py | Write-Host

如果我这样做,结果是:

Traceback (most recent call last):
  File ".\pyen.py", line 3, in <module>
    print(b'\xe2\x96\x88'.decode('utf8'))
  File "C:\python37\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2588' in position 0: character maps to <undefined>
cp1252

事实证明,这甚至不是一个写主机问题。只需将输出赋给一个变量,或将其管道化为Out Null,就会产生相同的错误:

PS> c:\python37\python.exe foo.py | Out-Null #Same error
PS> $a = c:\python37\python.exe foo.py #Same error
PS> c:\python37\python.exe foo.py #No error, stdout encoding is printed as utf-8

我不明白为什么会这样。Powershell为许多事情选择默认的windows代码页(cp1252)。你知道吗

这个答案提供了几个解决方案:Using UTF-8 Encoding (CHCP 65001) in Command Prompt / Windows Powershell (Windows 10)

不幸的是,将我的$PROFILE更改为设置输入和输出编码没有帮助。你知道吗

在这个答案中,启用utf-8全系统这个更持久的解决方案确实解决了这个问题,但这是一个beta特性,可能会破坏其他功能,所以我不想走这条路。你知道吗

我还尝试过设置python环境变量来编码或修改python源代码,但这些都不是很好的答案,因为这意味着要调整或更改任何python代码,我希望通过管道将其输出写入宿主。你知道吗

有什么想法吗?你知道吗


Tags: 答案inpy管道foostdoutsyserror

热门问题