基本上,我在 Windows 服务器上运行一个 Python 脚本,该脚本必须以一段文本作为输入。不幸的是,这段文本必须通过管道传递。例如:
PS > [something_that_outputs_text] | python .\my_script.py
所以问题是:
服务器使用 cp1252 编码,由于行政法规和其他原因,我真的无法更改它。当我将文本传输到我的 python 脚本时,当我读取它时,它已经带有,?而像这样的字符\xe1应该是。
?
\xe1
我目前所做的:
使用 UTF-8 测试。是的,chcp 65001并且$OutputEncoding = [Console]::OutputEncoding“解决了”,因为 python 完美地获取了文本,然后我可以将其解码为 unicode 等。但显然他们不允许我在服务器 /sadface 上执行此操作。
chcp 65001
$OutputEncoding = [Console]::OutputEncoding
一个小脚本来测试到底发生了什么:
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包装和无包装两种方式。
codecs
我的输入和输出:
PS > echo "Blá" | python .\testinput.py blé blé Bl?
–> 因此,该参数 (blé) 没有问题,但管道文本 (Blá) 却不好 :(
我甚至将text字符串转换为十六进制,是的,它会被3f(AKA mr ?) 淹没,所以这不是问题print。
text
3f
print
[另外:这是我在这里的第一个问题…请随时询问有关我所做的事情的更多信息]
编辑
我不知道这是否相关,但当我这样做时,sys.stdin.encoding它会产生None
sys.stdin.encoding
None
更新:所以…我使用 cmd 时没有遇到任何问题。sys.stdin.encoding在 cmd 上运行程序时检查了一下,一切正常。我觉得我的头都爆炸了。
如何将数据保存到文件中,并在 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 éêèë