考虑以下示例:

>>> 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 beta2PyUnicode_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/

10-11 22:47
查看更多