【问题标题】:Python 2.7 keep env variables from a subprocessPython 2.7 保留子进程中的环境变量
【发布时间】:2015-11-12 18:00:08
【问题描述】:

我正在调用一个导出一些变量的 bash 脚本,我找到了一种获取这些变量的方法并且它正在工作,一旦我尝试将 args 添加到我的 bash 脚本中它就会失败。 这是我的python脚本的一部分:

bash_script = "./testBash.sh"
script_execution = Popen(["bash", "-c", "trap 'env' exit; source \"$1\"  > /dev/null 2>&1",

                                  "_", bash_script], shell=False, stdout=PIPE)
err_code = script_execution.wait()
variables = script_execution.communicate()[0]

这是我的示例 Bash 脚本:

export var1="test1"

export var2=$var1/test2

echo "this is firsr var: var1=$var1"
echo "this is the second var: var2=$var2"

一旦我将bash_script = "./testBash.sh" 更改为bash_script = "./testBash.sh test test" 我没有将 bash 脚本中导出的变量返回到 Python 脚本中的 variables 变量中。 上面提供的是一个示例,当然我的真实脚本要大得多。

【问题讨论】:

  • 我认为您无法以合理的便携方式自动恢复环境。如果适合您,您可以做的是使用一个系统,您的脚本调用一个回调脚本来记录环境并将其传输到原始脚本(或者只是让您的 shell 脚本将环境转储到您可以读取的文件中,甚至通过stdout)。
  • 您在variables 中得到了什么?
  • 所有环境变量的列表,包括我在 bash 脚本中导出的环境变量
  • 那有什么问题?

标签: python bash python-2.7 variables subprocess


【解决方案1】:

如果您将 bash_script = "./testBash.sh" 更改为 bash_script = "./testBash.sh test test",则 bash_script 的名称将更改为 "./testBash.sh test test"'test test' 不会被解释为单独的参数。

相反,将额外的参数添加到传递给Popen的列表中:

bash_script = "./testBash.sh"
script_execution = Popen(
["bash", "-c", "trap 'env' exit; source \"$1\"  > /dev/null 2>&1",
 "_", bash_script, 'test', 'test'], shell=False, stdout=PIPE)

然后err_code 将是 0(表示成功),而不是 1。从您发布的代码中并不清楚您想要发生什么。多余的 test 参数将被忽略。

但是,额外的参数由 bash 脚本接收。如果你把

export var1="$2"

testBash.sh 中,那么variables(在Python 脚本中)将包含

var1=test

您可能还会发现它使用起来更方便

import subprocess
import os

def source(script, update=True):
    """
    http://pythonwise.blogspot.fr/2010/04/sourcing-shell-script.html (Miki Tebeka)
    http://stackoverflow.com/a/20669683/190597 (unutbu)
    """
    proc = subprocess.Popen(
        ". %s; env -0" % script, stdout=subprocess.PIPE, shell=True)
    output = proc.communicate()[0]
    env = dict((line.split("=", 1) for line in output.split('\x00') if line))
    if update:
        os.environ.update(env)
    return env

bash_script = "./testBash.sh"
variables = source(bash_script)
print(variables)

产生环境变量

{ 'var1': 'test1', 'var2': 'test1/test2', ... }

在字典中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2018-12-07
    • 2021-12-07
    • 2014-01-24
    • 2020-02-16
    相关资源
    最近更新 更多