当前位置: 首页 > 面试题库 >

Python子进程:cmd退出时回调

席兴平
2023-03-14
问题内容

我目前正在使用 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来说这似乎很常见,我想我会尝试先找到一个。

提前致谢 :)


问题答案:

您是对的-没有很好的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 html" target="_blank">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。



 类似资料:
  • 问题内容: 我正在使用ProcessBuilder启动子进程,并且如果父进程确实需要退出子进程。在正常情况下,我的代码可以正确阻止孩子。但是,如果我导致操作系统杀死父进程,则子进程将继续运行。 有什么方法可以将子进程“绑定”到父进程,以便在父进程被杀死时退出? 问题答案: 子进程与其父进程之间没有联系。他们可能彼此知道进程ID,但是它们之间没有硬连接。您在谈论孤立过程。这是操作系统级别的问题。意味

  • 问题内容: 有没有办法确保所有创建的子进程在Python程序退出时都消失了?所谓子流程,是指那些用subprocess.Popen()创建的内容。 如果不是,我是否应该遍历所有发出的终止点,然后终止-9?有什么清洁剂吗? 问题答案: 您可以为此使用 atexit ,并注册程序退出时要运行的所有清理任务。 atexit.register(func [,* args [, kargs]])** 在清理

  • 我有一个运行播放web应用程序的docker映像。在dockerfile中有一个CMD,它启动服务器,并等待您按下Ctrl+D退出。如果我这样做: 它工作正常-启动服务器并等待Ctrl+D。 然而,当我启动容器时,情况并非如此: 如何强制docker start不停止服务器?

  • 问题内容: 我想使用模块来完成此操作。 当我这样做时,例如: 我启动一个父进程,然后让父进程产生一个子进程, 然后我希望父进程退出自身,但子进程继续工作。 请允许我写一个 错误 代码来解释一下自己: 那么,我如何启动一个在父进程完成时不会被杀死的进程? 20140714 大家好 我的朋友刚刚告诉我一个解决方案… 我只是想… 无论如何,只要让您看到: 这确实有效!! 问题答案: 一个技巧:调用以退出

  • 本文向大家介绍在cmd命令行里进入和退出Python程序的方法,包括了在cmd命令行里进入和退出Python程序的方法的使用技巧和注意事项,需要的朋友参考一下 进入: 直接输入python即可,如图所示 退出: 1:输入exit(),回车 2:输入quit(),回车 3:输入ctrl+z,回车 以上这篇在cmd命令行里进入和退出Python程序的方法就是小编分享给大家的全部内容了,希望能给大家一个

  • 本文向大家介绍python子线程退出及线程退出控制的代码,包括了python子线程退出及线程退出控制的代码的使用技巧和注意事项,需要的朋友参考一下 下面通过代码给大家介绍python子线程退出问题,具体内容如下所示: 跑起来是没有问题的,但是使用ctrl + c中断的时候出问题了,主线程退出了,但子线程仍然运行。 于是在主线程增加了信号处理的代码,收到sigint时改变子线程循环条件 这样ctrl