我可以在Python中运行bash脚本并保留它导出的任何环境变量吗?

我可以在Python中运行bash脚本并保留它导出的任何环境变量吗?,python,bash,environment-variables,Python,Bash,Environment Variables,这个标题几乎说明了一切 假设我有一个bash脚本: #!/bin/bash # do some magic here, perhaps fetch something with wget, and then: if [ "$VAR1" = "foo" ]; then export CASEVARA=1 fi export CASEVARB=2 # and potentially many other vars... 如何从python运行此脚本并检查设置了哪些环境变量。理想情况下,

这个标题几乎说明了一切

假设我有一个bash脚本:

#!/bin/bash

# do some magic here, perhaps fetch something with wget, and then:
if [ "$VAR1" = "foo" ]; then
    export CASEVARA=1
fi
export CASEVARB=2

# and potentially many other vars...
如何从python运行此脚本并检查设置了哪些环境变量。理想情况下,我希望将它们“反向继承”到运行Python的主环境中

这样我就可以用

import os

# run the bash script somehow

print os.environ['CASEVARA']

使用子流程模块:

  • 在shell脚本中回显变量
  • 使用with
    stdout=subprocess.PIPE
    set从python运行bash脚本
  • 使用
    subprocess.communicate()
  • 将它们保存到python变量中

  • 当然可以!它只需要一些技巧:

    variables = subprocess.Popen(
        ["bash", "-c", "trap 'env' exit; source \"$1\" > /dev/null 2>&1",
           "_", "yourscript"],
        shell=False, stdout=subprocess.PIPE).communicate()[0]
    
    这将运行未修改的脚本,并在不同的行上以
    foo=bar
    的形式为您提供所有导出的变量


    在支持的操作系统(如GNU)上,您可以
    trap'env-0'exit
    获取
    \0
    分隔变量,以支持多行值

    为了使其对bash脚本透明,您可以从subprocess中将Popen子类化,并使其公开其进程的环境。你也可以从磁盘上抓取它环境的内容

    with open('/proc/%s/environ' % (pid,)) as f:
        env = f.read().replace('\x00', '\n')
    

    可以,但您正在与关闭和清理过程赛跑。

    否。变量导出仅适用于“子”壳。你不能继承到“祖先”外壳中。而且。。。另一个人的建议好多了:)哇,这真的管用!我几乎不知道它是如何工作的:)我的意思是,
    trap
    “”
    ,what?
    trap-env-exit
    在bash退出时运行
    env
    源文件;env
    可以工作,但如果脚本使用
    exit
    )就会失败。在脚本中,第一个非选项参数(
    \uu
    此处)变成了
    $0
    ,它在很大程度上是任意的,因此我将其命名为
    \u
    ,通常用于“不在乎”。谢谢。为了补充您的答案,我将它们解析到Python环境中:
    os.environ.update(dict([line.split('=')表示line-in-variables.split()])
    @frnhr-Nice。您可能希望使用
    variables.split(“\n”)
    对带空格的变量不失败,
    line.split('=',1)
    对带等号的变量不失败,并过滤掉不带
    =
    的条目,因为这仅仅是常规的,不一定是必需的。它在python2.7中工作吗<代码>操作系统环境更新(dict([line.split('='),用于line-in-variables.split()]))