这个问题已经有了答案:
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。但是,我知道的所有机制(subprocessos.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子句。

07-24 09:44
查看更多