python教程—Python子进程:cmd退出时的回调-Python实用宝典

python教程—Python子进程:cmd退出时的回调

我现在正在启动一个使用子进程的程序。Popen(cmd, shell=TRUE)我对Python相当陌生,但它“感觉”应该有一些api让我做类似的事情:

我现在正在启动一个使用子进程的程序。Popen (cmd, shell = TRUE)

我对Python相当陌生,但它“感觉”应该有一些api让我做类似的事情:

    subprocess.Popen(cmd, shell=TRUE, postexec_fn=function_to_call_on_exit)

我这样做是为了让function_to_call_on_exit能够在知道cmd已经退出的基础上执行一些操作(例如记录当前运行的外部进程的数量)

我假设我可以在一个结合了thread和Popen.wait()方法的类中封装相当简单的子进程,但是由于我还没有在Python中完成thread,而且看起来这对于API的存在来说已经足够常见了,所以我想我应该先尝试找到一个。

提前感谢:)

回答

你是对的-没有很好的API。您的第二个观点也是正确的——使用线程为您设计这样一个函数非常简单。

    import threading import subprocess def popenAndCall(onExit, popenArgs): """ Runs the given args in a subprocess.Popen, and then calls the function onExit when the subprocess completes. onExit is a callable object, and popenArgs is a list/tuple of args that would give to subprocess.Popen. """ def runInThread(onExit, popenArgs): proc = subprocess.Popen(*popenArgs) proc.wait() onExit() return thread = threading.Thread(target=runInThread, args=(onExit, popenArgs)) thread.start() # returns immediately after the thread starts return thread

即使在Python中线程也非常简单,但是请注意,如果onExit()的计算开销非常大,那么您将希望将其放在一个单独的进程中,而不是使用多处理(这样GIL就不会降低程序的运行速度)。它实际上非常简单——您基本上可以替换所有对线程的调用。与多处理线程。因为它们遵循(几乎)相同的API。

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
1

发表评论