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

2024-04-23 08:54:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图通过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已停止工作”和“Windows正在检查问题的解决方案…”:

prog.exe has stopped working

这就变成了“导致程序停止正常工作的问题”。Windows将关闭程序并通知您是否有可用的解决方案。“:

prog.exe has truly stopped working

当我关闭该对话框时,子进程将退出并返回一个错误:

255
>>>

怎么回事?我认为os.environ本质上是作为env传递给subprocess,如果我不指定env。为什么我指定它会导致我的程序死机呢?你知道吗

我尝试了Python3.5和Python2.7,得到了相同的结果。你知道吗


Tags: text命令buildenv进程osmore错误
1条回答
网友
1楼 · 发布于 2024-04-23 08:54:12

in an older SO post所述,os.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
>>> 

相关问题 更多 >