从Python脚本设置环境变量

1 投票
3 回答
18198 浏览
提问于 2025-04-17 08:20

我在用c-shell,习惯用setenv命令。现在我想在一个Python脚本里执行一个类似的命令。我试着用os.environ['JAVA_HOME'] = "/usr/local/java",这个在Python解释器里能用,但当我从命令行运行我的脚本时,那个运行脚本的shell并没有显示我新设置的环境变量。有没有人能帮我一下,我对脚本还不太熟悉,希望我问得清楚。

3 个回答

0

我知道这个问题已经有一段时间了,但我用了一种稍微不同的方法解决了它。

也许这不是最完美的解决方案,但它确实有效。

我创建了一个叫做 env.sh 的脚本。

#!/bin/tcsh
eval $*

然后在我的 Python 脚本中调用了这个脚本。

output = subprocess.Popen(["env.sh", "setenv", "DISPLAY", "remhost:0"], stdout = subprocess.PIPE).communicate()[0].split()

这个方法对我有效,别忘了通过执行 "chmod +x env.sh" 来让 env.sh 脚本可以执行。

1

正如在如何在Linux上使用export与Python中所解释的那样,在任何进程中设置环境变量(比如你的Python脚本)是无法影响到任何父进程的(比如你用来执行Python脚本的csh进程)。

你可以做的是让你的Python脚本打印出一个setenv命令,然后在你的命令行中把这个输出当作命令来执行。

举个例子:

csh% cat foo.py
#!/usr/bin/python

import os;

os.environ["JAVA_HOME"] = "/usr/local/java"

print "setenv JAVA_HOME", os.environ["JAVA_HOME"]
csh% ./foo.py
setenv JAVA_HOME /usr/local/java
csh% echo $JAVA_HOME 
JAVA_HOME: Undefined variable.
csh% eval `./foo.py` 
csh% echo $JAVA_HOME 
/usr/local/java
csh% 

你还可以在你的~/.cshrc文件中设置一个别名来执行eval `...`,或者直接在你的.cshrc.login文件中调用它(这取决于你想要实现什么)。

2

如果你在使用 subprocess.Popen,只需要在创建这个对象的时候,传入一个叫 env 的参数,内容是你需要的环境变量,格式是字典(你可以复制 os.environ 的内容,然后再加上你自己的环境变量)。

撰写回答