小能豆

Python 管道 cp1252 字符串从 PowerShell 到 python(2.7)脚本

py

基本上,我在 Windows 服务器上运行一个 Python 脚本,该脚本必须以一段文本作为输入。不幸的是,这段文本必须通过管道传递。例如:

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

所以问题是:

服务器使用 cp1252 编码,由于行政法规和其他原因,我真的无法更改它。当我将文本传输到我的 python 脚本时,当我读取它时,它已经带有,?而像这样的字符\xe1应该是。

我目前所做的:

使用 UTF-8 测试。是的,chcp 65001并且$OutputEncoding = [Console]::OutputEncoding“解决了”,因为 python 完美地获取了文本,然后我可以将其解码为 unicode 等。但显然他们不允许我在服务器 /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(AKA mr ?) 淹没,所以这不是问题print

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

编辑

我不知道这是否相关,但当我这样做时,sys.stdin.encoding它会产生None

更新:所以…我使用 cmd 时没有遇到任何问题。sys.stdin.encoding在 cmd 上运行程序时检查了一下,一切正常。我觉得我的头都爆炸了。


阅读 8

收藏
2025-01-11

共1个答案

小能豆

如何将数据保存到文件中,并在 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
éêèë
2025-01-11