gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:13:21 24 4
gpt4 key购买 nike

场景

在我的 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

-->参数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

导出 PARAM=param2echo $PARAM

--> 参数2python test2.py

--> 参数 1 $PARAM

我要求测试 2 产生与测试 1 相同的结果,因为 $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)

关于python - 如何在 subprocess.Popen() 中使用现有的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37488480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com