subprocess.Popen args

时间:2018-01-22 14:15:24

标签: windows python-2.7 encoding subprocess

关于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上复制粘贴相同的命令字符串,它可以正常工作。

除了上面描述的内容之外,我还尝试了什么:

  1. 检查所有Python脚本是否都以UTF-8编码。他们是。
  2. 更改为unicode(cmd = u'...'),在第5行(UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 128: ordinal not in range(128)来电)收到Popen
  3. 已更改为cmd = u'...'.decode('utf-8'),已在第3行(UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 128: ordinal not in range(128)来电)收到decode
  4. 更改为cmd = u'...'.encode('utf8'),结果为Testç on ã and ê
  5. 已添加PYTHONIOENCODING=utf-8个环境。没有运气的变数。
  6. 看看第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。

    提前致谢。

1 个答案:

答案 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')

不幸的是,如果字符串包含无法编码到当前代码页中的字符,则仍然会失败。