如果“env”参数包含unicode对象,为什么Popen在Windows上失败?

考虑这个例子:

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

但是我无法findPyUnicode_Check做的PyUnicode_Check

http://hg.python.org/cpython/file/26af48f65ef3/Objects/unicodeobject.c#l73

Solutions Collecting From Web of "如果“env”参数包含unicode对象,为什么Popen在Windows上失败?"

如错误消息所述,环境只能包含字符串。 你的第一个Popen调用满足这个条件,但是第二个不会因为你将PATH映射到用u"..."语法创建的Unicode对象。 向Popen提供环境字典时只使用字节字符串,您不会得到这个错误。

请注意,通过回溯来判断,您使用的是Python 2.6,所以链接的代码实际上并不适用,因为它来自Python 3.3.0 beta2 。 PyUnicode_Check检查对象是否为unicode对象,这在Python 3中是有意义的,在这种情况下,字符串(内部实现为)unicode对象。 然而,在Python 2.6中, 等价的一行是使用PyString_Check ,这会使你的第二个例子失败。