从python脚本设置环境变量

时间:2011-12-13 22:11:57

标签: java python environment-variables csh

我正在使用c-shell而且我习惯使用setenv。我需要在python脚本中执行等效命令。我尝试使用os.environ ['JAVA_HOME'] =“/ usr / local / java”,它可以从python解释器中运行,但是当我的脚本从命令行执行时,它运行的shell确实反映了新设置的环境变量。任何人都可以提供帮助,我是脚本编写的新手,我希望我能清楚地提出问题。

3 个答案:

答案 0 :(得分:2)

如果您正在使用subprocess.Popen,那么将env参数传递给构造函数就足以将其作为字典传递给您了(您可以复制os.environ的内容和如果你愿意,可以添加你自己的环境变量。

答案 1 :(得分:1)

How to use export with Python on Linux中所述,在任何进程(例如Python脚本)中设置环境变量都不会影响任何父进程(例如执行Python脚本的csh进程)。

您可以做的是让Python脚本打印setenv命令,然后将shell中的输出作为命令进行评估。

例如:

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 :(得分:0)

我知道这个问题已经有一段时间了,但我解决了一点不同。 也许这甚至不是最美丽的解决方案,但它确实有效。

我创建了一个名为env.sh

的shell脚本

#!/bin/tcsh
eval $*

#!/bin/tcsh eval $*

然后在我的python脚本中调用subprocess。

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

这对我有用,别忘了通过执行“chmod + x env.sh”来制作env.sh可执行文件