从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调用“源”?


慕森卡
浏览 1982回答 3
3回答

人到中年有点甜

source 不是可执行命令,而是内置的shell。使用的最常见情况source是运行更改环境的Shell脚本并将该环境保留在当前Shell中。这就是virtualenv修改默认python环境的方式。创建子流程并source在子流程中使用可能不会做任何有用的事情,也不会修改父流程的环境,使用源脚本的任何副作用都不会发生。Python有一个类似的命令,execfile该命令使用当前的python全局名称空间(或另一个,如果您提供一个)来运行指定的文件,您可以使用与bash命令类似的方式source。

繁星coding

您可以只在子shell中运行该命令,然后使用结果更新当前环境。def shell_source(script):&nbsp; &nbsp; """Sometime you want to emulate the action of "source" in bash,&nbsp; &nbsp; settings some environment variables. Here is a way to do it."""&nbsp; &nbsp; import subprocess, os&nbsp; &nbsp; pipe = subprocess.Popen(". %s; env" % script, stdout=subprocess.PIPE, shell=True)&nbsp; &nbsp; output = pipe.communicate()[0]&nbsp; &nbsp; env = dict((line.split("=", 1) for line in output.splitlines()))&nbsp; &nbsp; os.environ.update(env)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python