关于Python的另一个编码问题。
如何在subprocess.Popen
来电时将非ASCII字符作为参数传递?
我的问题不是在stdin / stdout上作为StackOverflow上的大多数其他问题,而是在Popen的args
参数中传递这些字符。
用于测试的Python脚本:
import subprocess
cmd = 'C:\Python27\python.exe C:\path_to\script.py -n "Testç on ã and ê"'
process = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output, err = process.communicate()
result = process.wait()
print result, '-', output
对于此示例调用,script.py
会收到Testç on ã and ê
。如果我在CMD shell上复制粘贴相同的命令字符串,它可以正常工作。
除了上面描述的内容之外,我还尝试了什么:
cmd = u'...'
),在第5行(UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 128: ordinal not in range(128)
来电)收到Popen
。cmd = u'...'.decode('utf-8')
,已在第3行(UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 128: ordinal not in range(128)
来电)收到decode
。cmd = u'...'.encode('utf8')
,结果为Testç on ã and ê
PYTHONIOENCODING=utf-8
个环境。没有运气的变数。看看第2和第3次尝试,似乎Popen
在内部发出了decode
电话,但我没有足够的Python经验可以根据这种可疑情况进行推进。
环境:在Windows Server 2012 R2上运行的Python 2.7.11。
我已经搜索过类似的问题,但没有找到任何解决方案。在what is the encoding of the subprocess module output in Python 2.7?中提出了类似的问题,但没有提供可行的解决方案。
我读到Python 3改变了字符串和编码的工作方式,但目前不能升级到Python 3。
提前致谢。
答案 0 :(得分:4)
如评论中所述,Python 2中的subprocess.Popen
调用Windows函数CreateProcessA
,它接受当前配置的代码页中的字节字符串。幸运的是,Python的编码类型为mbcs
,它代表当前的代码页。
cmd = u'C:\Python27\python.exe C:\path_to\script.py -n "Testç on ã and ê"'.encode('mbcs')
不幸的是,如果字符串包含无法编码到当前代码页中的字符,则仍然会失败。