1

在对 stackoverflow 和 python 2.7 文档进行了几天的研究之后,我对此没有任何结论。

基本上我在 Windows 服务器上运行一个 python 脚本,该脚本必须有一个文本块作为输入。这个文本块(不幸的是)必须通过管道传递。就像是:

PS > [something_that_outputs_text] | python .\my_script.py

所以问题是:

服务器使用cp1252编码,由于行政法规之类的,我真的无法更改。当我将文本通过管道传输到我的 python 脚本时,当我阅读它时,它已经带有?\xe1应该是这样的字符。

到目前为止我做了什么:

使用 UTF-8 测试。是的,chcp 65001并且$OutputEncoding = [Console]::OutputEncoding“解决它”,因为在 python 中可以完美地获取文本,然后我可以将其解码为 un​​icode 等。但显然他们不允许我在服务器 /sadface 上这样做。

一个小脚本来测试到底发生了什么:

import codecs
import sys

def main(argv=None):
    if argv is None:
        argv = sys.argv
        if len(argv)>1:
            for arg in argv[1:]:
                print arg.decode('cp1252')

    sys.stdin = codecs.getreader('cp1252')(sys.stdin)
    text = sys.stdin.read().strip()
    print text
    return 0

if __name__=="__main__":
    sys.exit(main())

尝试了codecs包装和不包装。

我的输入和输出:

PS > echo "Blá" | python .\testinput.py blé
blé
Bl?

--> 所以论点(blé)没有问题,但管道文本(Blá)不好:(

我什至将text字符串转换为十六进制,是的,它被3f(AK​​A mr ?) 淹没了,所以print.

[另外:这是我在这里的第一个问题......请随时询问有关我所做的更多信息]

编辑

我不知道这是否相关,但是当我这样做sys.stdin.encodingNone

更新:所以...我对 cmd 没有任何问题。sys.stdin.encoding在 cmd 上运行程序时检查,一切正常。我想我的头爆炸了。

4

1 回答 1

0

将数据保存到文件中并在 CMD 会话中将其传送到 Python 怎么样?在 CMD 上调用 Powershell 和 Python。像这样,

c:\>powershell -command "c:\genrateDataForPython.ps1 -output c:\data.txt"
c:\>type c:\data.txt | python .\myscript.py

编辑

另一个想法:在Powershell中将数据转换为base64格式,并在Python中解码。Base64 在 Powershell 中很简单,我想在 Python中也不难。像这样,

# Convert some accent chars to base64
$s  = [Text.Encoding]::UTF8.GetBytes("éêèë")
[System.Convert]::ToBase64String($s)
# Output:
w6nDqsOow6s=

# Decode:
$d  = [System.Convert]::FromBase64String("w6nDqsOow6s=")
[Text.Encoding]::UTF8.GetString($d)
# Output
éêèë
于 2013-09-27T04:45:07.347 回答