我正在尝试使用 python 设置环境变量。这个变量在另一个脚本中使用。我的代码是:
#!/usr/bin/env python
import os
os.environ['VAR'] = '/current_working_directory'
执行上述python脚本后,我执行第二个使用相同变量'VAR'的脚本,但它不工作。但是当我这样做export VAR='/current_working_directory
并运行第二个脚本时,它工作正常。我也试过putenv()
。
我正在尝试使用 python 设置环境变量。这个变量在另一个脚本中使用。我的代码是:
#!/usr/bin/env python
import os
os.environ['VAR'] = '/current_working_directory'
执行上述python脚本后,我执行第二个使用相同变量'VAR'的脚本,但它不工作。但是当我这样做export VAR='/current_working_directory
并运行第二个脚本时,它工作正常。我也试过putenv()
。
这取决于如何调用第二个 python 脚本。
如果你有一个外壳,并且外壳首先运行第一个 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
子进程不能改变其父进程的环境。
对此的一般 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
显然,如果在不调用 Python 的情况下获得的输出first.py
很简单,那通常是更好的方法;但是对于例如让两个脚本从库中调用不同的函数和/或与公共后端通信,这是一种常见的模式。
不过,使用 Python 进行两段 Python 代码之间的通信通常更优雅,也更符合 Python 风格。
#!/usr/bin/env python
from yourlib import first, second
value=first()
# maybe putenv VAR here if that's really, really necessary
second(value)
此代码应为您的第二个脚本提供所需的环境:
#!/usr/bin/env python
import os
os.environ['VAR'] = '/current_working_directory'
execfile("/path/to/your/second/script.py")