如何用Python [System.Console] :: OutputEncoding / InputEncoding`?

时间:2016-08-27 16:59:54

标签: python .net shell powershell

在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
п»ї????

2 个答案:

答案 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

https://github.com/adamdriscoll/snek