问题描述
我在tc shell中工作,并使用setenv foo bar
之类的命令来设置环境脚本。我曾经使用命令source set_env.sh
运行此脚本,然后在设置环境后运行编译命令make my_ target...
我想通过调用subprocess.Popen
甚至os.system
从Python执行来自动化整个过程。麻烦是:
- 从Python打开的Shell无法识别命令
source
。我的假设是 / bin / bash 外壳已打开。如何强制Python打开 / bin / tcsh ? - 如何为第二个命令(
make my_ target...
)保留更改的环境设置?
解决方法
如果您在Python中使用subprocess
软件包,则默认情况下它将不会运行Shell,它将仅启动一个进程(不使用Shell)。您可以添加shell=True
,但是这样做对您没有多大好处,因为仅为 current 进程设置了环境变量,并且不会将其发送回父进程。
Python启动tcsh
子进程,并且子进程不会影响父进程。
解决方案是使脚本打印出环境变量,然后在Python中解析其输出。
因此,如果您的脚本打印如下内容:
XX=one
YY=two
然后在Python中执行类似的操作:
for line in output.split('\n'):
if line == '':
continue
k,v = line.split('=')
os.environ[k] = v