【发布时间】:2016-05-27 16:36:45
【问题描述】:
场景
在我的 python 脚本中,我需要将可执行文件作为子进程运行,其中包含可执行文件所期望的 x 个命令行参数。
例子:
- 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
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=param2 回显 $PARAM
--> 参数2 python test2.py
--> 参数1 $PARAM
考虑到 $PARAM 仅在运行时已知并且需要从当前环境中检索,我要求测试 2 产生与测试 1 相同的结果。
欢迎您的建议。
【问题讨论】:
-
param2 = os.environ["PARAM"]做你想做的事,还是不完全?我从不记得传递给Popen的参数以使引用正确 - 问题是它引用了你的参数,这样它们就不会扩展。
标签: python subprocess