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

时间:2016-05-27 16:36:45

标签: python subprocess

方案

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

示例:

  • EG 1:myexec.sh param1 param2
  • EG 2:myexec.sh param1 $ MYPARAMVAL

可执行文件和参数未知,因为它们是在运行时从外部源(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

- > param1 param2

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

导出PARAM = param2 echo $ PARAM

- >参数2 python test2.py

- > param1 $ PARAM

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

我欢迎你的建议。

3 个答案:

答案 0 :(得分:5)

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

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

或者,你可以在构造命令时自己查询环境变量,然后就不需要shell扩展了

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

答案 1 :(得分:2)

你可以这样做:

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

或者:

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

答案 2 :(得分:0)

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

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