这个问题已经有了答案:
How to get the environment variables of a subprocess after it finishes running?
4个答案
在windows上,我想在python脚本中使用第三方命令行工具。假设它位于foobar.exe
下。foobar附带了一个额外的批处理文件C:\Program Files (x86)\foobar
,它将设置运行init_env.bat
的shell环境。
我想编写一个python脚本,它首先调用foobar.exe
一次,然后多次调用init_env.bat
。但是,我知道的所有机制(subprocess、os.system和backticks)似乎都会为每次执行生成一个新的进程。因此,调用foobar.exe
是无用的,因为它不会改变运行python脚本的进程的环境,因此对init_env.bat
的每个后续调用都会失败,因为它的环境没有设置。
是否可以从python调用foobar.exe
以允许init_env.bat
更改调用脚本进程的环境?
最佳答案
是否可以从python调用init_env.bat
以允许init_env.bat
更改调用脚本的环境
过程?
不过,如果init_env.bat
非常简单,您可以尝试解析它,并自己对os.environ
进行更改。
否则,在一个子shell中生成它,然后调用set
来输出新的环境变量,并从中解析输出就容易多了。
以下对我有用…
初始环境蝙蝠
@echo off
set FOO=foo
set BAR=bar
足球棒.bat
@echo off
echo FOO=%FOO%
echo BAR=%BAR%
主.py
import sys, os, subprocess
INIT_ENV_BAT = 'init_env.bat'
FOOBAR_EXE = 'foobar.bat'
def init_env():
vars = subprocess.check_output([INIT_ENV_BAT, '&&', 'set'], shell=True)
for var in vars.splitlines():
k, _, v = map(str.strip, var.strip().partition('='))
if k.startswith('?'):
continue
os.environ[k] = v
def main():
init_env()
subprocess.check_call(FOOBAR_EXE, shell=True)
subprocess.check_call(FOOBAR_EXE, shell=True)
if __name__ == '__main__':
main()
……输出……
FOO=foo
BAR=bar
FOO=foo
BAR=bar
请注意,我只使用批处理文件来代替您的
python main.py
,因为我手头没有可以确认设置了环境变量的foobar.exe
文件。如果使用的是
.exe
文件,则可以从.exe
行中删除shell=True
子句。