【问题标题】:Python pipe cp1252 string from PowerShell to a python (2.7) script从 PowerShell 到 python (2.7) 脚本的 Python 管道 cp1252 字符串
【发布时间】:2013-09-26 17:46:47
【问题描述】:

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

基本上,我在 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(又名?)淹没了,所以print 没有问题。

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

编辑

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

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

【问题讨论】:

  • 只想补充一点,同时幸运的是,我得到了一台 Linux 服务器,并且编码一切正常……不再为 PowerShell 头疼。

标签: python powershell character-encoding pipe cp1252


【解决方案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 it isn't hard either 中。像这样,

# 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
éêèë

【讨论】:

  • 起初我让我的程序处理文件(跟踪我在做什么也对我有好处)。但不幸的是,管理员告诉我不要这样做(这是医院服务器......)。但是,是的,它在 CMD 上运行良好。即使是简单的例子echo "Olá" | python .\myscript.py为什么?
  • @orestes,如果管理员担心数据安全,写入 EFS 加密文件夹如何?在这种情况下,文件内容非常安全,不会被窥探。至于为什么部分,请查看CMD session上的code page
  • 好的,第二部分真的很有帮助。非常感谢。但是,我现在得到了一个 Linux 服务器来工作,并且摆脱了麻烦的 cp1252 编码;-) 谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2017-08-06
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多