所以,我要做的是从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脚本之后自己运行然后程序完成。 有什么建议吗?
答案 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
方法,父进程将在此处阻塞,等待子进程完成。 out
和err
表示子进程的正常输出和错误输出。您可以使用它来获取bash脚本的输出。