在Powershell v5,Windows 8.1,Python 3.为什么这些失败以及如何修复?
[system.console]::InputEncoding = [System.Text.Encoding]::UTF8;
[system.console]::OutputEncoding = [System.Text.Encoding]::UTF8;
chcp;
"import sys
print(sys.stdout.encoding)
print(sys.stdin.encoding)
sys.stdout.write(sys.stdin.readline())
" |
sc test.py -Encoding utf8;
[char]0x0422+[char]0x0415+[char]0x0421+[char]0x0422+"`n" | py -3 test.py
打印:
Active code page: 65001
cp65001
cp1251
п»ї????
答案 0 :(得分:8)
您正在将数据传输到Python;那时Python的stdin
不再附加到TTY(您的控制台),也不会猜测编码可能是什么。而是使用默认系统区域设置;在你的系统上是cp1251(基于Windows Latin-1的代码页)。
设置PYTHONIOENCODING
environment variable以覆盖:
PYTHONIOENCODING
如果在运行解释器之前设置了此值,则它将使用语法encodingname:errorhandler
覆盖用于stdin / stdout / stderr的编码。encodingname
和:errorhandler
部分都是可选的,与str.encode()
中的含义相同。
PowerShell似乎不像UNIX shell那样支持每命令行环境变量;最简单的方法是先设置变量:
Set-Item Env:PYTHONIOENCODING "UTF-8"
甚至
Set-Item Env:PYTHONIOENCODING "cp65001"
因为Windows UTF-8代码页显然不是完全 UTF-8,具体取决于Windows版本,并且使用或不使用管道重定向。
答案 1 :(得分:2)
为什么不在powerhell中嵌入CPython?! CPython很容易嵌入,而PowerShell对play with .NET and COM objects的REPL非常好。以下是使用PowerShell中的pythonnet的简单介绍。请注意编码如何自动从powershell传播到python。
Windows PowerShell
Copyright (C) 2015 Microsoft Corporation. All rights reserved.
PS C:\Users\denfromufa> [system.console]::InputEncoding = [System.Text.Encoding]::UTF8;
PS C:\Users\denfromufa> [system.console]::OutputEncoding = [System.Text.Encoding]::UTF8;
PS C:\Users\denfromufa> [Reflection.Assembly]::LoadFile("C:\Python\Miniconda3_64b\Lib\site-packages\Python.Runtime.dll")
GAC Version Location
--- ------- --------
False v4.0.30319 C:\Python\Miniconda3_64b\Lib\site-packages\Python.Runtime.dll
PS C:\Users\denfromufa> $gil = [Python.Runtime.Py]::GIL()
PS C:\Users\denfromufa> $sys=[Python.Runtime.Py]::Import("sys")
PS C:\Users\denfromufa> $sys.stdin.encoding.ToString()
cp65001
PS C:\Users\denfromufa> $sys.stdout.encoding.ToString()
cp65001
PS C:\Users\denfromufa> $gil.Dispose()
PS C:\Users\denfromufa> [Python.Runtime.PythonEngine]::Shutdown()
PS C:\Users\denfromufa>
[编辑]
以下是snek
个开发者之一发布的powershell
个软件包,用于在Python
中嵌入powershell
: