以此示例代码片段为例。在Windows中处理unicode subprocess env的正确方法是什么?
import subprocess
import os
env = os.environ.copy()
env["FOO"] = u"foo"
subprocess.check_call(["ls", "-l"], env=env)
在Windows上,这会失败。
C:\Python27\python.exe test.py
Traceback (most recent call last):
File "test.py", line 7, in <module>
subprocess.check_call(["ls", "-l"], env=env)
File "C:\Python27\lib\subprocess.py", line 535, in check_call
retcode = call(*popenargs, **kwargs)
File "C:\Python27\lib\subprocess.py", line 522, in call
return Popen(*popenargs, **kwargs).wait()
File "C:\Python27\lib\subprocess.py", line 710, in __init__
errread, errwrite)
File "C:\Python27\lib\subprocess.py", line 958, in _execute_child
startupinfo)
TypeError: environment can only contain strings
sys.path
是documented是使用Unicode完全确定。处理这个(和类似的代码)的正确方法是什么,以便一切按预期工作?显而易见的解决方案是在unicode路径上调用.encode()
,但我不确定这是否会导致意外行为。
错误消息似乎不言自明;据推测,Python根本不支持使用Unicode环境变量创建子进程。 – 2015-04-03 08:55:26