为什么为我的Python子进程提供一个环境会导致它中止?

时间:2016-09-15 13:10:56

标签: python windows subprocess case-sensitive

我正在尝试通过Python运行由我公司开发的可执行文件的子进程;我们称之为prog.exe。我可以从CMD运行这个命令就好了;我可以通过subprocess运行得很好;但如果我尝试将env传递给subprocess,我会收到错误:

C:\Users\me> prog.exe -h
prog V1.2.2 (Build 09-07-2016.12.52)
more dummy help text...
C:\Users\me> python
Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> import os
>>> subprocess.Popen("prog.exe -h").wait()
prog V1.2.2 (Build 09-07-2016.12.52)
more dummy help text...
0
>>> 
>>> subprocess.Popen("prog.exe -h", env=os.environ).wait()

执行该命令后,将打开以下对话框,通知我" prog.exe已停止工作"和#34; Windows正在检查问题的解决方案......":

prog.exe has stopped working

变为"问题导致程序停止正常工作。 Windows将关闭程序并在解决方案可用时通知您。":

prog.exe has truly stopped working

当我关闭该对话框时,子进程退出时出现错误:

255
>>>

发生了什么事?如果我没有指定os.environ,我认为env基本上以subprocess传递给env。那么为什么当我指定它会导致我的程序死亡?

我尝试过Python 3.5和Python 2.7,结果相同。

1 个答案:

答案 0 :(得分:1)

如上所述in an older SO postos.environ密钥以不区分大小写的方式存储/访问。 nt.environ保留了传递给Python进程的环境变量的情况。

在这种情况下,prog.exe显然以区分大小写的方式访问环境变量,因此需要传入原始的混合大小写环境。

使用nt.environ而不是os.environ可以解决问题:

>>> import nt
>>> subprocess.Popen("prog.exe -h", env=nt.environ).wait()
prog V1.2.2 (Build 09-07-2016.12.52)
more dummy help text...
0
>>>