我正在尝试使用python设置环境变量。此变量用于另一个脚本。 我的代码是:
#!/usr/bin/env python
import os
os.environ['VAR'] = '/current_working_directory'
执行上面的python脚本后,我执行第二个使用相同变量'VAR'的脚本,但它不起作用。
但是当我执行export VAR='/current_working_directory
并运行第二个脚本时,它运行正常。我也试过putenv()
。
答案 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)