为了账号安全,请及时绑定邮箱和手机立即绑定

从subprocess.Popen调用“ source”命令

从subprocess.Popen调用“ source”命令

慕森卡 2019-10-29 13:00:11
我有一个.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_exceptionOSError: [Errno 2] No such file or directory>>> foo = subprocess.Popen("source the_script.sh", shell = True)>>> /bin/sh: source: not found是什么赋予了?当我可以在python之外访问时,为什么不能从Popen调用“源”?
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

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


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


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


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


查看完整回答
反对 回复 2019-10-29
?
繁星coding

TA贡献1797条经验 获得超4个赞

您可以只在子shell中运行该命令,然后使用结果更新当前环境。


def shell_source(script):

    """Sometime you want to emulate the action of "source" in bash,

    settings some environment variables. Here is a way to do it."""

    import subprocess, os

    pipe = subprocess.Popen(". %s; env" % script, stdout=subprocess.PIPE, shell=True)

    output = pipe.communicate()[0]

    env = dict((line.split("=", 1) for line in output.splitlines()))

    os.environ.update(env)


查看完整回答
反对 回复 2019-10-29
  • 3 回答
  • 0 关注
  • 1981 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信