[英]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不是一个选择。 ...,因为它比较复杂)。
这是一个做它的小图书馆:
也许尝试在导出之前,之后和之后比较结果,然后运行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.