如何在 subprocess.Popen() 中使用现有的环境变量
How to use an existing Environment variable in subprocess.Popen()
场景
在我的 python 脚本中,我需要 运行 一个可执行文件作为子进程,其中包含可执行文件期望的 x 个命令行参数。
示例:
- EG 1: myexec.sh 参数 1 参数 2
- EG 2: myexec.sh 参数 1 $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
导出参数=参数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)
场景
在我的 python 脚本中,我需要 运行 一个可执行文件作为子进程,其中包含可执行文件期望的 x 个命令行参数。
示例:
- EG 1: myexec.sh 参数 1 参数 2
- EG 2: myexec.sh 参数 1 $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
导出参数=参数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)