1

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

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

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

4

3 回答 3

2

这取决于如何调用第二个 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

于 2013-07-23T07:56:14.700 回答
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

显然,如果在不调用 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)
于 2013-07-23T08:45:12.617 回答
0

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

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

execfile("/path/to/your/second/script.py")
于 2013-07-23T08:15:20.257 回答