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