【问题标题】:How to use an existing Environment variable in subprocess.Popen()如何在 subprocess.Popen() 中使用现有的环境变量
【发布时间】: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


【解决方案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)

【讨论】:

    【解决方案2】:

    你可以这样做:

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

    或者:

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

    【讨论】:

    • 如果环境变量名称“PARAM”在 str 变量中怎么办。所以需要评估。?
    • @user3927078 你也可以给env={'PARAM':'String'}
    • 我无法在 Python 2 或 3 中完成这项工作 - 我做错了什么? >>> cmdlist = ['echo','param1','$PARAM']>>> proc = subprocess.Popen(cmdlist,stdout=subprocess.PIPE, env={'PARAM':"ads"})>>> proc.communicate()('param1 $PARAM\n', None)
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2017-07-11
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      相关资源
      最近更新 更多