如何从Python执行批处理文件,以便它可以改变调用进程的环境?

时间:2013-07-12 12:34:11

标签: python windows shell

在Windows上,我想在我的python脚本中使用3 rd 派对命令行工具。假设foobar.exe位于C:\Program Files (x86)\foobar下方。 Foobar附带一个额外的批处理文件init_env.bat,它将设置foobar.exe运行的shell环境。

我想编写一个python脚本,首先会调用init_env.bat一次,然后多次调用foobar.exe。但是,我所知道的所有机制(subprocessos.system和反引号)似乎都会为每次执行产生一个新进程。因此,调用init_env.bat是没用的,因为它不会改变运行python脚本的进程的环境,因此每次对foobar.exe的调用都会失败,因为它的环境没有设置。

是否可以通过允许init_env.bat改变调用脚本进程环境的方式从python中调用init_env.bat

1 个答案:

答案 0 :(得分:4)

  

是否可以以允许的方式从python中调用init_env.bat   init_env.bat改变调用脚本的环境   过程

不容易,但是,如果init_env.bat非常简单,您可以尝试解析它,并自己对os.environ进行更改。

否则,在子shell中生成它会更容易,然后调用set来输出新的环境变量,并从中解析输出。

以下为我工作......

<强> init_env.bat

@echo off
set FOO=foo
set BAR=bar

<强> foobar.bat

@echo off
echo FOO=%FOO%
echo BAR=%BAR%

<强> main.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()

... python main.py输出......

FOO=foo
BAR=bar
FOO=foo
BAR=bar

请注意,我只使用批处理文件代替foobar.exe,因为我没有方便的.exe文件可以确认环境变量已设置。

如果您使用的是.exe文件,则可以从shell=True行中删除subprocess.check_call(FOOBAR_EXE, shell=True)条款。