如何从具有相同i / o的python脚本运行bash可执行文件?

时间:2016-08-26 23:47:38

标签: python bash shell executable

所以,我要做的是从python脚本执行一个程序,我在shell中执行。我已经阅读了其他问题,所以我可以用:

def bash(cmd):
    subprocess.Popen(cmd, shell=True, executable='/bin/bash')
bash('./my/file')

现在第一个问题是我经常想从shell终止程序。通常,如果我从终端做“./my/file”,我可以用ctrl + c来阻止它。但是使用子进程以某种方式在后台运行它,我只能通过命令“top”杀死它,并通过bash中的pid杀死它。但是程序产生了大量的进程,所以我确实无法以合理的方式杀死它。

另外,我想要做的第二件事是在执行更多我的python脚本之前等待程序完成运行。我试着设置......

process=subprocess.Popen(cmd, shell=True, executable='/bin/bash')
process.wait()

但实际上它在启动后几乎立即就停止了。

我可以单独执行脚本,但是我没有看到使用程序结果的方法而没有创建第三个脚本,我必须在原始python脚本之后自己运行然后程序完成。 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

首先问题,请尝试preexec_fn参数:

import signal
import ctypes
libc = ctypes.CDLL("libc.so.6")
def set_pdeathsig(sig = signal.SIGTERM):
    def callable():
        return libc.prctl(1, sig)
    return callable
p = subprocess.Popen(args, preexec_fn = set_pdeathsig(signal.SIGTERM))

这将确保subprocess.Popen生成的所有子进程在父进程退出后立即自动退出。所以你需要杀死的只是python进程。

对于第二个问题,请尝试communicate方法:

process=subprocess.Popen(cmd, shell=True, executable='/bin/bash', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()

它将在python进程和子进程之间构建一个管道,通过它可以将输入数据传递给子进程,并返回结果。如果您不调用communicate方法,通常该过程将在后台运行,并且结果(如果存在)将被丢弃。

通过调用communicate方法,父进程将在此处阻塞,等待子进程完成。 outerr表示子进程的正常输出和错误输出。您可以使用它来获取bash脚本的输出。