我可以在Python中运行bash脚本并保留它导出的任何环境变量吗?
这个标题几乎说明了一切 假设我有一个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运行此脚本并检查设置了哪些环境变量。理想情况下,
#!/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
set从python运行bash脚本stdout=subprocess.PIPE
- 使用
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()]))