在一个脚本中设置环境变量,并在另一个脚本中使用此变量

时间:2013-07-23 07:44:41

标签: python

我正在尝试使用python设置环境变量。此变量用于另一个脚本。 我的代码是:

#!/usr/bin/env python
import os
os.environ['VAR'] = '/current_working_directory'

执行上面的python脚本后,我执行第二个使用相同变量'VAR'的脚本,但它不起作用。 但是当我执行export VAR='/current_working_directory并运行第二个脚本时,它运行正常。我也试过putenv()

3 个答案:

答案 0 :(得分:2)

这取决于第二个python脚本的调用方式。

如果你有一个shell,并且shell首先运行第一个python脚本,那么第二个,它将无法运行。原因是第一个python脚本从shell继承了环境。但是修改os.environ[]或调用putenv()只会修改继承的环境---来自第二个python脚本的环境,不是来自shell脚本的环境。

如果现在shell脚本运行第二个python脚本,它将再次从shell继承环境...并且由于shell脚本未经修改,您无法看到第一个python脚本所做的修改。

实现目标的一种方法是使用帮助文件:

#!/bin/bash
rm -f envfile
./first_pythonscript
test -f envfile && . envfile
rm -f envfile
./second_pythonscript

该代码很粗糙,如果shell脚本的两个实例运行,它将无法工作,因此不要按原样使用它。但我希望你明白这一点。

另一种方法是让你的second_pythonscript不是一个程序,而是first_pythonscript可以导入的Python模块。您也可以在导入时将其设为混合库,在通过if __name__ == "__main__":构造运行时进行编程。

最后,您可以使用其中一个os功能,例如os.spawnvpe

答案 1 :(得分:0)

此代码应为第二个脚本提供所需的环境:

#!/usr/bin/env python
import os
os.environ['VAR'] = '/current_working_directory'

execfile("/path/to/your/second/script.py")

答案 2 :(得分:0)

子进程无法更改其父进程的环境。

一般的shell编程解决方案是让您的第一个脚本打印出您需要的值,并在调用过程中分配它。然后就可以了

#!/bin/sh
# Assign VAR to the output from first.py
VAR="$(first.py)"
export VAR
exec second.py

甚至更简洁

#!/bin/sh
VAR="$(first.py)" second.py

显然,如果first.py的输出在不调用Python的情况下获得是微不足道的,那通常是一种更好的方法;但对于例如有两个脚本从库中调用不同的函数和/或与公共后端通信,这是一种常见的模式。

使用Python进行两段Python代码之间的通信往往更加优雅和Pythonic。

#!/usr/bin/env python
from yourlib import first, second
value=first()
# maybe putenv VAR here if that's really, really necessary
second(value)