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

2023-11-22

Scenario

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

Example:

  • EG 1: myexec.sh 参数1 参数2
  • 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

蟒蛇测试1.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 回显$PARAM

--> 参数2蟒蛇测试2.py

--> 参数1 $PARAM

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

我欢迎您的建议。


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

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

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

subprocess.Popen(['echo', 'param1', os.environ['PARAM']], stdout=subprocess.PIPE)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐