繁体   English   中英

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

[英]How to get the environment variable set by a bash script from inside a python script?

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

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

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

这是一个做它的小图书馆:

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

也许尝试在导出之前,之后和之后比较结果,然后运行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

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

但是,您可以通过调用python脚本本身来做大致等效的操作。 当然,您需要发信号通知它不要在第二次调用时执行此操作,否则最终将导致无限(尾)递归。

下面的小“模块”(您可以将其导入,但是您应该在启动之前立即进行操作,然后再进行其他操作)将检查是否已设置环境变量SETENV ,如果已设置,它将重新发出python在获取由SETENV命名的文件后,执行命令(尽其所能,因此,如果这不仅是简单的脚本执行,它可能会出错)。 它缺乏很多错误检查功能,因此不应该被认为可以投入生产; 而是概念证明:

# 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM