从Python脚本设置环境变量
我在用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
的内容,然后再加上你自己的环境变量)。