3

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

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

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

4

3 回答 3

2

这是一个可以做到这一点的小库:

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

于 2014-09-17T18:16:42.513 回答
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
于 2013-10-17T15:36:00.063 回答
1

最简单的解决方案显然是您不想要的,即为每个 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
于 2013-10-17T19:08:15.720 回答