一尘不染

Python子进程:cmd退出时回调

python

我目前正在使用 subprocess.Popen(cmd, shell=TRUE)

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

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

我这样做是为了function_to_call_on_exit在知道cmd已经退出的情况下可以执行某些操作(例如,对当前正在运行的外部进程数进行计数)

我以为我可以将子流程包装在将线程与Popen.wait()方法结合在一起的类中,但是由于我还没有在Python中完成线程,而且对于API来说这似乎很常见,我想我会尝试先找到一个。

提前致谢 :)


阅读 165

收藏
2020-12-20

共1个答案

一尘不染

您是对的-没有很好的API。您也说对了第二点-设计一个使用线程为您执行此操作的函数非常容易。

import threading
import subprocess

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

甚至线程在Python中都非常容易,但是请注意,如果on_exit()的计算量很大,则需要将其放在单独的进程中,而不是使用多处理(这样GIL不会降低程序速度)。这实际上非常简单-
您基本上可以将所有调用替换为threading.Threadmultiprocessing.Process因为它们遵循(几乎)相同的API。

2020-12-20