从subprocess.Popen调用“ source”命令


问题内容

我有一个.sh脚本可供调用source the_script.sh。定期调用此方法很好。但是,我试图通过python脚本调用它subprocess.Popen

从Popen调用它,在以下两个场景调用中出现以下错误:

foo = subprocess.Popen("source the_script.sh")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 672, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1213, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory


>>> foo = subprocess.Popen("source the_script.sh", shell = True)
>>> /bin/sh: source: not found

是什么赋予了?当我可以在python之外访问时,为什么不能从Popen调用“源”?


问题答案:

source 不是可执行命令,而是内置的shell。

使用的最常见情况source是运行更改环境的Shell脚本并将该环境保留在当前Shell中。这就是virtualenv修改默认python环境的方式。

创建一个子流程并source在该子流程中使用可能不会做任何有用的事情,也不会修改父流程的环境,使用源脚本的任何副作用都不会发生。

Python有一个类似的命令,execfile该命令使用当前的python全局命名空间(如果提供,则使用另一个)来运行指定的文件,您可以使用与bash命令类似的方式source