通过linux中的管道设置和使用环境变量

时间:2014-09-09 14:54:08

标签: python linux environment-variables pipe

如何在一个脚本中设置环境变量,在将输出汇总到另一个脚本之后,我需要在第一个脚本中设置某个环境变量并在第二个脚本中使用。

我正在使用python脚本。

python script1.py | python script2.py

script1.py,我正在做

os.environ["some_key"] = some_value

并在script2.py中,我试图将其视为

saved_value = os.environ["some_key"]

当我尝试运行上述脚本时,

Traceback (most recent call last):
  File "script2.py", line 11, in <module>
    filename = os.environ["some_key"]
  File "/usr/lib/python2.7/UserDict.py", line 23, in __getitem__
    raise KeyError(key)

无论如何这可以纠正吗?我特别需要从os.environ["some_key"]中的script2.py读取它,因为该文件是更大框架的一部分而无法更改它。我与script1.py

具有灵活性

2 个答案:

答案 0 :(得分:3)

除非您自己启动,否则无法设置其他进程的环境变量 -

如果可以,请考虑使用script1直接更改script2以启动subprocess.Popen,并提供env参数。

如果您不能这样做,您需要更改父进程(可能是启动脚本的bash脚本),以某种方式从script1接收所需的变量并设置它在启动script2时。

答案 1 :(得分:2)

您将无法改变兄弟进程的环境。

您可以使用如下所示的复杂构造:

{ export some_key=$(python script1.py) ; } |& python script2.py

其中script1.py将环境变量输出到stdout,并将要输入的内容写入script2.pystderr。这只会允许设置一个环境变量。

示例:

$ cat script1.py 
import sys
print "some_env_value"
sys.stderr.write("some_piped_value\n")
$ cat script2.py 
import os
import sys

print "Passed through enviroment:", os.environ["some_key"]
print "Passed through stdin:",

for line in sys.stdin:
        print line

结果:

$ { export some_key=$(python script1.py) ; } |& python script2.py
Passed through enviroment: some_env_value2
Passed through stdin: some_piped_value