如何在 subprocess.Popen() 中使用现有的环境变量

How to use an existing Environment variable in subprocess.Popen()

场景

在我的 python 脚本中,我需要 运行 一个可执行文件作为子进程,其中包含可执行文件期望的 x 个命令行参数。

示例:

未知可执行文件和参数,因为它们是在 运行 时间从外部源(xml 配置)配置和检索的。

当参数为已知值 (EG 1) 并已配置时,我的代码可以正常工作,但期望参数可以是环境变量并按此配置,应在 运行 处解释时间.(EG 2)

在下面的示例中,我使用 echo 代替 myexec.sh 来演示该场景。 这被简化以演示问题。 'cmdlst' 是从配置文件构建的,它可以是具有任意数量的参数和值的任何脚本,这些参数和值可以是值或环境变量。

test1.py

import subprocess
import os

cmdlst = ['echo','param1','param2']

try:
    proc = subprocess.Popen(cmdlst,stdout=subprocess.PIPE)
    jobpid = proc.pid
    stdout_value, stderr_value = proc.communicate()
except (OSError, subprocess.CalledProcessError) as err:
    raise

print stdout_value

结果测试 1

python test1.py

--> 参数 1 参数 2

test2.py

import subprocess
import os

cmdlst = ['echo','param1','$PARAM']

try:
    proc = subprocess.Popen(cmdlst,stdout=subprocess.PIPE)
    jobpid = proc.pid
    stdout_value, stderr_value = proc.communicate()
except (OSError, subprocess.CalledProcessError) as err:
    raise

print stdout_value

结果测试 2

导出参数=参数2 echo $PARAM

--> 参数 2 python test2.py

--> 参数 1 $PARAM

我要求测试 2 产生与测试 1 相同的结果,因为 $PARAM 仅在 运行 时已知并且需要从当前环境中检索。

我欢迎你的建议。

您无法使用 $VAR 访问环境变量。您将使用 os.environ[..] 代替:

cmdlst = ['echo','param1',os.environ['PARAM']]

你可以这样做:

cmdlist = ['echo','param',os.environ["PARAM"]]

或者:

cmdlist = ['echo','param1','$PARAM']
proc = subprocess.Popen(cmdlist,stdout=subprocess.PIPE, env={'PARAM':os.environ['PARAM'])

如果你想shell扩展环境变量,你必须设置shell=True

subprocess.Popen('echo param1 $PARAM', shell=True, stdout=subprocess.PIPE)

也可以在构造命令的时候自己查询环境变量,这样就不需要shell扩展

subprocess.Popen(['echo', 'param1', os.environ['PARAM']], stdout=subprocess.PIPE)