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

2024-05-27

我目前正在使用启动一个程序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 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.Thread with multiprocessing.Process因为它们遵循(几乎)相同的 API。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python子进程:cmd退出时的回调 的相关文章

随机推荐

  • 惰性共享异步资源——澄清一下?

    我在斯蒂芬的书的末尾看到了这个例子 该代码可以通过以下方式访问more比一个线程 static int simpleValue static readonly Lazy
  • JsDoc 到 PDF 渲染器

    有人知道将 JsDoc 转换为 PDF 的工具吗 或者您必须通过将 HTML 文件转换为 PDF 来做到这一点 感谢您的回答 我所知道的 JSDoc 转换器是用 JavaScript 编写的 并且经过硬编码以生成 HTML 标签 我所知道的
  • Foreach循环无法找到对象

    我正在尝试将 foreach 与并行后端结合使用来加速计算 用于特征选择的 AUCRF 随机森林的交叉验证 如果这确实重要的话 在这样做的过程中 我需要获取向量的子集 向量的名称可以更改 但可以作为字符向量进行访问 我使用 eval par
  • 为什么我的 jupyter 笔记本中不需要“%matplotlib inline”?

    我只是想理解为什么我的 jupyter 安装不需要我运行 matplotlib inline 根据我读过的所有内容 我应该运行它才能将我的绘图内联到我的 jupyter 笔记本中 但事实是 无论我是否运行 matplotlib inline
  • Lambda 变量名 - 为短名称,还是不为短名称? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通常 当我使用 lambda 时 我只使用 a b c d 作为变量名称 因为类型很容易推断 而且我发现短名称更易于阅读 这是一个例子 var
  • 如何在 Heroku 中安装 NLTK 模块

    嘿 我想在我的 Heroku 服务器上安装 NLTK pos tag 我该怎么办呢 请给我一些步骤 因为我是 Heroku 服务器系统的新手 我刚刚添加了官方nltk支持构建包 只需添加一个nltk txt文件包含要安装的语料库列表 一切都
  • 一次性删除不正确的后续解决方案

    我有一个谓词 它找到正确的解决方案 但随后又找到不正确的解决方案 data D data threshold nonredundantbumps D 5 Bs write D 3 6 7 8 2 4 5 6 9 4 7 3 D 3 6 7
  • jest快照测试:如何忽略jest测试结果中的部分快照文件

    问题 忽略 snap 文件测试结果的某些部分 这里的问题是 我的测试中有一些组件具有随机值 我并不真正关心测试它们 有什么办法可以忽略我的 X snap 文件的一部分吗 因此 当我将来运行测试时 它不会给我测试失败的结果 现在您还可以使用属
  • 如何使用 Newtonsoft Json.NET 处理 JSON 文档中的对象引用?

    我有一个 json 数据集 带有标准数据字段和参考字段 它看起来像这样 id 1 name Book description Something you can read id 2 name newspaper description re
  • Android Json结果处理

    我有这样的 Json 结果 array getJSONObject j 执行代码 WAT2 FreeIssuePrefix DisPaySchedulePrefix NextFreeIssueNo 1 NextReturnNo 20 Upl
  • Spring boot 404错误自定义错误响应ReST

    我正在使用 Spring boot 来托管 REST API 即使浏览器正在访问 URL 以及自定义数据结构 我也希望始终发送 JSON 响应 而不是使用标准错误响应 我可以使用 ControllerAdvice 和 ExceptionHa
  • 将异步函数包装在结构中时的生命周期

    我正在尝试将异步函数包装在结构中 例如 use std future Future struct X struct Y async fn f x X gt Y Y struct MyStruct
  • Java:BufferedInputStream 的 available() 方法存在问题

    我正在处理以下代码 用于将大文件拆分为一组较小的文件 FileInputStream input new FileInputStream this fileToSplit BufferedInputStream iBuff new Buff
  • 谁知道 Picasa 是用什么编程的?

    我正在寻找有关如何构建 Picasa 的信息 因为我想为我的应用程序创建一个类似的界面 信息可以包括编程语言 UI设计等 我找到了这个美丽的 Picasa UI 由动态 PSD 文件组成 http web archive org web 2
  • 完整的 C++ i18n gettext()“hello world”示例

    我正在寻找完整的 i18ngettext 你好世界的例子 我已经开始了一个基于的脚本使用 GNU gettext 的本机语言支持教程 https web archive org web 20130330233819 http oriya s
  • 如何删除带有操作栏、视图页面和多个片段的选项卡?

    我正在使用我找到的代码here https stackoverflow com questions 10082163 actionbarsherlock tabs multi fragments public class ActionBar
  • craigslist 混搭如何获取数据? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将额外的参数传递给多态函数?

    我有一个多态函数 可以将列表转换为集合 import shapeless PolyDefns gt import shapeless val lists List 1 2 List A B List 1 1 2 2 HNil object
  • Java - 了解 PrintWriter 和刷新的需要

    好吧 首先我对所有代码表示歉意 但我觉得代码太多总比代码不够好 我正在制作一个简单的聊天客户端和印刷机 尤其是我正在努力解决的问题 使用现在的代码 它将与服务器类交互 并且完美地打印我想要打印的内容 但是 当我删除 writer flush
  • Python子进程:cmd退出时的回调

    我目前正在使用启动一个程序subprocess Popen cmd shell TRUE 我对 Python 相当陌生 但 感觉 应该有一些 api 可以让我做类似的事情 subprocess Popen cmd shell TRUE po