考虑以下示例:
>>> import subprocess as sp
>>> sp.Popen("notepad2.exe",env={"PATH":"C:\\users\\guillermo\\smallapps\\bin"})
<subprocess.Popen object at 0x030DF430>
>>> sp.Popen("notepad2.exe",env={"PATH":u"C:\\users\\guillermo\\smallapps\\bin"})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python26\lib\subprocess.py", line 633, in __init__
errread, errwrite)
File "C:\Python26\lib\subprocess.py", line 842, in _execute_child
startupinfo)
TypeError: environment can only contain strings
我已将错误追溯到此CPython代码:
http://hg.python.org/cpython/file/ca54c27a9045/Modules/_winapi.c#l511
我无法理解
PyUnicode_Check
的作用,但是:http://hg.python.org/cpython/file/26af48f65ef3/Objects/unicodeobject.c#l73
最佳答案
如错误消息所述,环境必须仅包含字符串。您的第一个Popen
调用满足此条件,但第二个条件不满足,因为您将PATH
映射到使用u"..."
语法创建的Unicode对象。在为Popen
提供环境命令时,仅使用字节字符串,您将不会收到此错误。
请注意,从回溯来看,您正在使用Python 2.6,因此链接的代码实际上并不适用,因为它来自Python 3.3.0 beta2。 PyUnicode_Check
检查对象是否是unicode对象,这在Python 3中是有意义的,在Python 3中,字符串是(内部实现为)unicode对象。但是,在Python 2.6中,the equivalent line使用PyString_Check
,这会使您在第二个示例中失败。
关于python - 如果 "env"参数包含unicode对象,为什么Popen在Windows上失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12253014/