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

时间:2014-04-09 16:55:24

标签: 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运行此脚本并检查设置的env变量。理想情况下,我希望反向继承"反向继承"它们进入运行Python的主环境。

这样我就可以用

访问它们了
import os

# run the bash script somehow

print os.environ['CASEVARA']

3 个答案:

答案 0 :(得分:8)

当然!它只需要一些黑客攻击:

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个分开的变量,以支持多行值。

答案 1 :(得分:1)

使用子流程模块:

  • 在shell脚本中回显变量
  • 使用带有stdout=subprocess.PIPE set
  • subprocess.Popen从python运行bash脚本
  • 使用subprocess.communicate()
  • 接听它们
  • 将它们保存为python变量

答案 2 :(得分:0)

为了使它对bash脚本透明,你可以从子进程中继承Popen并让它暴露它的进程的环境。你也可以从磁盘中获取它的内容

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

会起作用,但是你会反对关闭和清理这个过程。