Почему Popen терпит неудачу в Windows, если параметр «env» содержит объект unicode?

Рассмотрим этот пример:

>>> 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 с объектом Unicode, созданным с помощью синтаксиса u"..." Используйте только байтовые строки при предоставлении среды dicts для Popen и вы не получите эту ошибку.

Обратите внимание, что, судя по трассировке, вы используете Python 2.6, поэтому связанный код на самом деле не применяется, потому что он исходит из Python 3.3.0 beta2 . PyUnicode_Check проверяет, что объект является объектом unicode, что имеет смысл в Python 3, где строки (внутренние реализованы как) объекты unicode. Однако в Python 2.6 эквивалентная строка использует PyString_Check , что приведет к ее отказу во втором примере.