如何从python脚本中获取由bash脚本设置的环境变量?

时间:2013-10-17 14:11:21

标签: python bash environment-variables

我有一个setenv.sh脚本,在其他几个脚本的开头调用,其中大多数是bash脚本。显然,这个脚本确实设置了一些环境变量,这些变量稍后是这些脚本的用户。

现在,问题是我想在一些python脚本中实现相同的行为,并且我发现如果运行setenv,python脚本的环境不会更新。

因为我不想创建另一个首先调用setenv.sh和其他myscript.py的脚本 - 我正在寻找一种方法来说服python加载这些变量(解析seteve.h是不是一个选择......因为它更复杂)。

3 个答案:

答案 0 :(得分:2)

这是一个小型图书馆:

https://github.com/aneilbaboo/shellvars-py

答案 1 :(得分:1)

也许尝试在导出之前和之后运行env并比较结果。像这样的东西

$ pwd
/tmp/test
$ cat setenv.sh
#!/bin/bash
export test=1234
$ cat test.sh
#!/bin/bash
source /tmp/test/setenv.sh
echo $test
$ ./test.sh
1234
$ python test.py
test=1234
$ cat test.py
#/usr/bin/env python
import os, subprocess
p=subprocess.Popen('env',stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True)
oldEnv=p.communicate()[0]
p=subprocess.Popen('source /tmp/test/setenv.sh ; env',stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True)
newEnv=p.communicate()[0]
for newStr in newEnv.split('\n'):
    flag = True
    for oldStr in oldEnv.split('\n'):
        if newStr == oldStr:
            #not exported by setenv.sh
            flag = False
            break
    if flag:
        #exported by setenv.sh
        print newStr

答案 2 :(得分:1)

最简单的解决方案显然是你不想要的解决方案,即为每个python脚本创建一个新的脚本文件。

但是,您可以通过让python脚本调用自身来大致相当于等效。当然,你需要发信号通知它不会在第二次调用时这样做,否则你最终会得到无限(尾部)递归。

以下小“模块”(你可以导入,但你应该在启动时,在其他任何事情之前做)将检查环境变量SETENV是否已设置,如果是,在获取SETENV命名的文件后,它将重新发出python命令(尽可能地,如果它不仅仅是一个简单的脚本执行,它可能会出错)。它缺乏大量的错误检查,不应被视为生产就绪;而是一个概念验证:

# file env_set.py
import os
import sys

if sys.argv[0] and "SETENV" in os.environ:
  setenv = os.environ["SETENV"]
  del os.environ["SETENV"]
  os.execvp("bash", ["bash", "-c",
        "source " + setenv + "; exec python " + sys.argv[0] + ' "${@}"',
        "--"] + sys.argv[1:])

还有一点测试:

# file test_env_set.py
import env_set

import os
import sys
for name in sys.argv[1:]:
  if name in os.environ:
    print(name + "=" + os.environ[name])
  else:
    print("Undefined: " + name)

# file setenv.sh
export the_answer=42

$ python test_env_set.py SETENV the_answer
Undefined: SETENV
Undefined: the_answer
$ SETENV=setenv.sh python test_env_set.py SETENV the_answer
Undefined: SETENV
the_answer=42