在tcsh中打开python设置环境

问题描述

我在tc shell中工作,并使用setenv foo bar之类的命令来设置环境脚本。我曾经使用命令source set_env.sh运行此脚本,然后在设置环境后运行编译命令make my_ target...

我想通过调用subprocess.Popen甚至os.system从Python执行来自动化整个过程。麻烦是:

  1. 从Python打开的Shell无法识别命令source。我的假设是 / bin / bash 外壳已打开。如何强制Python打开 / bin / tcsh
  2. 如何为第二个命令(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