在Windows上,我想在我的python脚本中使用3 rd 派对命令行工具。假设foobar.exe
位于C:\Program Files (x86)\foobar
下方。 Foobar附带一个额外的批处理文件init_env.bat
,它将设置foobar.exe
运行的shell环境。
我想编写一个python脚本,首先会调用init_env.bat
一次,然后多次调用foobar.exe
。但是,我所知道的所有机制(subprocess,os.system和反引号)似乎都会为每次执行产生一个新进程。因此,调用init_env.bat
是没用的,因为它不会改变运行python脚本的进程的环境,因此每次对foobar.exe
的调用都会失败,因为它的环境没有设置。
是否可以通过允许init_env.bat
改变调用脚本进程环境的方式从python中调用init_env.bat
?
答案 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)
条款。