subprocess.wait() 不等待 Popen 进程完成(使用线程时)?

2024-03-17

我在使用时遇到一些问题subprocess.Popen()使用线程从我的 python 脚本生成同一应用程序的多个实例,使它们同时运行。在每个线程中,我使用以下命令运行应用程序popen()调用,然后我通过调用等待它完成wait()。问题似乎在于wait()-call 实际上并不等待进程完成。我进行了实验,仅使用一个线程,并在进程开始和结束时打印出文本消息。所以线程函数看起来像这样:

def worker():
    while True:
        job = q.get() # q is a global Queue of jobs
        print('Starting process %d' % job['id'])
        proc = subprocess.Popen(job['cmd'], shell=True)
        proc.wait()
        print('Finished process %d' % job['id'])
        job.task_done()

但即使当我只使用一个线程时,它也会在出现任何“已完成进程...”消息之前打印出几条“正在启动进程...”消息。是否存在以下情况:wait()其实不等吗?我有几个不同的外部应用程序(C++ 控制台应用程序),这些应用程序又将同时运行多个实例,对于其中一些实例,我的代码可以工作,但对于其他应用程序,则不能。外部应用程序是否存在某些问题,会以某种方式影响对wait()? 创建线程的代码如下所示:

for i in range(1):
    t = Thread(target=worker)
    t.daemon = True
    t.start()
q.join() # Wait for the queue to empty

Update 1: 我还应该补充一点,对于某些外部应用程序,我有时会得到返回代码(proc.returncode)为-1073471801。例如,其中一个外部应用程序将在前两次给出该返回代码Popen被调用,但不是最后两个(当我有四份工作时)。

Update 2: 为了澄清事情,现在我有四个作业在队列中,这是四个不同的测试用例。当我运行代码时,对于其中一个外部应用程序,前两个应用程序Popen-调用生成返回码-1073471801。但是如果我打印确切的命令Popen调用,并在命令窗口中运行它,它执行没有任何问题。

Solved!我设法解决了我遇到的问题。我认为问题是我缺乏线程编程经验。我错过了这样一个事实:当我创建第一个工作线程时,它们将继续存在,直到 python 脚本退出。每次我将新项目放入队列时,我都会错误地创建更多工作线程(我为每个要运行的外部程序批量执行此操作)。因此,当我到达第四个外部应用程序时,我有四个线程同时运行,尽管我以为我只有一个线程。


你也可以使用check_call() https://docs.python.org/3/library/subprocess.html#subprocess.check_call而不是波彭。check_call() https://docs.python.org/3/library/subprocess.html#subprocess.check_call等待命令完成,即使shell=True然后返回作业的退出代码。

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

subprocess.wait() 不等待 Popen 进程完成(使用线程时)? 的相关文章

  • 如何计算总和的平方和?

    我有一笔款项需要加快处理速度 在一种情况下是 S x y k l Fu ku Fv lv Fx kx Fy ly 另一种情况是 S x y S k l Fu ku Fv lv Fx kx Fy ly 2 注意 S indices 是这些索引
  • 如何将一组重叠范围划分为不重叠范围?

    假设您有一组范围 0 100 一 0 75 b 95 150 c 120 130 d 显然 这些范围在某些点上重叠 您将如何剖析这些范围以生成不重叠范围的列表 同时保留与其原始范围相关的信息 在本例中为范围后面的字母 例如 运行算法后的上述
  • 如何阻止 Django 中发生级联删除?

    我的 Django 应用程序中有三个模型类 class Folder models Model folder models ForeignKey Folder null True blank True related name folder
  • 动态添加jinja模板

    我有一个 jinja 模板 它是一组 div 标签内的唯一内容 div include temppage html div 当我按下按钮时 我想用其他内容替换标签之间的所有内容 我希望用另一个 jinja 模板 include realpa
  • 具有相同内容的拆分列表

    例如我有以下列表 contents i have two pens prices 5 made in and 我想将它们分开 使其具有与以下内容相同的内容 array 0 i have two pens array 1 prices 5 a
  • AES 会话密钥的 RSA 解密失败,并显示“AttributeError:‘bytes’对象没有属性‘n’”

    我正在努力在 Python 3 6 上从 PyCryptodome 实现公钥加密 当我尝试创建对称加密密钥并加密 解密变量时 一切正常 但是当我引入 RSA 和 PKCS1 OAEP 的那一刻 一切就都顺理成章了 session key加密
  • 如何使用 tweepy 仅提取主题标签中的文本?

    我想为我的情感分析项目提取主题标签 但是我得到了一个字典列表 其中包含所有主题标签及其在推文中的索引 我只想要文字 我的代码 data tweepy Cursor api search q since a i until b i items
  • Python Raspberry pi - 如果路径不存在,则跳过循环

    我有一个收集温度 文本文件中的值 的功能 它使用部分预定义的路径 但是 有时如果温度传感器未加载 断开连接 则路径不存在 如果路径不可用 如何设置条件或例外来跳过循环 我想使用 continue 但我不知道要设置什么条件 def read
  • 根据Python中两行之间的匹配创建一个带有[0,1]的新列

    我正在尝试将多个列表或数据帧与一个大型基础数据帧进行比较 然后对于任何匹配 我想附加一个存储 1 匹配或 0 不匹配的列 df pd DataFrame Name A B C D ID 5 6 6 7 8 9 7 list1 5 6 8 9
  • 如何编辑 QProgressBar 的样式表

    我无法在我的应用程序中编辑进度条的颜色 仅编辑文本颜色 pyhton 3 9 PySide6 QT Creator 7 0 2 Python应用程序 https i stack imgur com 6hKFI png import sys
  • 仅获取图像中的外部轮廓

    我有这段代码 可以在图像中绘制轮廓 但我只需要外部轮廓 import cv2 import numpy as np camino C Users Usuario Documents Deteccion de Objetos 123 jpg
  • Python range() 和 zip() 对象类型

    我了解功能如何range and zip 可以在 for 循环中使用 然而我期望range 输出一个列表 很像seq在 Unix shell 中 如果我运行以下代码 a range 10 print a 输出是range 10 表明它不是一
  • 如何配置应用程序中的所有记录器

    Python 的日志记录模块允许模块或类定义自己的记录器 不同的记录器可以有不同的处理程序 其中一些可能选择记录到文件 而另一些则选择记录到标准输出 现在 我的应用程序使用其中几个模块 每个模块都有自己的记录器 这些记录器具有各种处理程序
  • 使用 Thread.Sleep() 时,异步编程如何与线程一起工作?

    假设 前言 在之前的问题中 我们注意到Thread Sleep阻塞线程参见 什么时候使用Task Delay 什么时候使用Thread Sleep https stackoverflow com questions 20082221 whe
  • 如何检索 SQLAlchemy 结果集的 python 列表? [复制]

    这个问题在这里已经有答案了 我有以下查询来检索单列数据 routes query select schema stop times c route number schema stop times c stop id stop id dis
  • 使用 asyncio 时应该如何创建属性?

    在创建使用 asyncio 的类时 我发现自己处于属性 getter 需要进行 io 操作的情况 因此该函数应该是一个协程 然而 等待房产的感觉却很不寻常 这是我的意思的一个最小的例子 该代码有效并且可以运行 import asyncio
  • java - 简单计算在多线程中比在单线程中花费更长的时间

    我试图了解如何利用多线程 我写了一个简单的程序来增加i 比方说 使用两种方式 400 000 次 单线程方式 0 到 400 000 和多线程方式 在我的例子中 4 次 0 到 100 000 线程数等于Runtime getRuntime
  • 使 flake8 区分未定义函数和星型导入

    我有一个相当大的项目 我试图在发布之前清理它 但是当我运行 flake8 时 我得到了大量的 F405
  • Python中矩阵元素的双重求和

    基于下面的简化示例 我想在我的代码中 from sympy import import numpy as np init printing x y symbols x y mat Matrix x 1 1 y X 1 2 3 Y 10 20
  • 重定向到破折号中的 url

    我正在使用 dash 构建一个仪表板 每当单击特定数据点时 我都会创建一个唯一的 url 如何将用户重定向到此创建的 url 我正在使用下面给出的代码 每当有人单击任何数据点时 单击事件就会触发并执行回调函数 app layout html

随机推荐

  • XAMPP Apache 和 MySQL 服务在首次安装后未启动或停止

    您好 我想开始学习 PHP 和 MySql 并完善我对 Javascript 的了解 目前我只使用 jQuery 并且只知道该语言的核心语法 我选择阅读学习 PHP MySQL 和 JavaScript https rads stackov
  • 有人发布过任何 C# 4 编码标准/指南/风格指南吗?

    我了解 C 2 和 C 3 的许多编码标准和指南 但正在寻找一些针对 C 4 编写的标准和指南 我正在发布 C 4 0 的新编码指南here http csharpguidelines codeplex com releases view
  • ng-repeat 选择列表中的初始值

    请帮助 ng repeat 我使用 ng repeat 创建了一个值列表 如何指定我要首先显示的列表中间的值 我想在列表中首先显示 地球 我的代码 html li class list item poster title li 控制器 us
  • 加载器框架和活动生命周期

    我很喜欢loaders以及他们的好处 但我遇到了一个我不知道如何解决的问题 在我的活动中 我使用 AsyncTaskLoader 从数据库加载一些数据并向onLoadFinished Loader
  • 相当于 Surefire + JUnit 的 @DirtiesContext(...) 吗?

    我正在使用maven surefire plugin with junit4 1 4 我有一个单元测试 它依赖于内部使用的第三方类static 代码块来初始化一些变量 对于一项测试 我需要更改这些变量之一 但仅限于某些测试 我希望在测试之间
  • 如何将自定义对象列表绑定到 ComboBox?

    如何将自定义对象列表绑定到组合框 这就是我目前所拥有的 this classCmbo DataSource viewModel Coarses this classCmbo DisplayMember Name this classCmbo
  • 疯狂的 JavaFX 帧速率 - 有什么想法吗?

    JavaFX 具有疯狂的帧速率 我今天演示了不同的 JavaFX 动画选项 然而 在我用于演示的机器上 AnimationTimer 的行为非常奇怪 据我了解 JavaFX 的目标应该是 60FPS 左右的速率 并且在每帧之前调用动画计时器
  • 如何在 ERB 中编写像 标签这样的纯 HTML?

    我想更换 gt 但我不明白为什么这比
  • 用于 C++ 的类似codingbat的网站[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 伙计们 我需要找到一个好的网站 比如编码蝙蝠 http codingbat com 再次学习 C 我在学校学过它 但后来我从未认真使用过它
  • 如何从 fullcalendar JS 视图中删除所有日期?

    我正在尝试构建一个在 fullcalendar 中创建事件的应用程序 我根本不允许用户在客户端创建 allDay 事件 但他们仍然可以在视图中看到它 有什么方法可以从视图中完全删除 allDays 吗 function initCalend
  • 在 TextField IText 中调整文本

    抱歉 如果存在像我这样的类似帖子 但我是这个论坛的新手 我还没有找到它 我在动态调整 TextField 大小取决于文本大小时遇到 问题 我填写现有的 PDF 填写 AcroForm 中的字段 form setField 字段 值 等 一切
  • 检查字符串是否为日期 Postgresql

    有没有什么功能PostgreSQL返回Boolean给定的字符串是否是日期 就像ISDATE 在 MSSQL 中 ISDATE January 1 2014 您可以创建一个函数 create or replace function is d
  • 在 OS X El Capitan 上使用 libssl 编译 C 程序?

    我有一个使用 libssl 的简单 C 程序 在 Linux 上 我安装了 openssl dev 包并使用以下行编译了程序 gcc test libssl c o test libssl lcrypto lssl 现在我想在我的 Mac
  • 如何将数组的元素作为单独的参数传递给函数?

    我有一个像这样的函数 但有更多参数 function do something n1 n2 n3 return n1 n2 n3 然后我有一个包含 3 个项目的数组 它们是该函数的参数 my array 10 123 14 例如 do so
  • SQL Server JDBC 异常

    当使用 ANT 构建我的 Java 应用程序时 我不断收到此错误 我已多次尝试使用 SQLJDBC JAR 和 SQLJDBC4 JAR 但不断收到此错误消息 我完全困惑为什么即使升级到 sqljdbc4 jar 后也会收到此错误 java
  • Nginx 未运行且没有错误消息

    我正在尝试启动我的 nginx 服务器 当我输入 gt etc init d nginx start 时 出现一条消息 正在启动 nginx 然后什么也没有发生 没有错误消息 当我检查 nginx 的状态时 我发现它没有运行 这是我的 et
  • 程序在 execvp( command.argv[0], command.argv) 之后停止

    我正在编写一个小型 shell 程序 它接受命令并执行它 如果用户输入无效命令 if 语句将返回 1 如果命令正确 则执行该命令 但是一旦执行该命令 程序就会结束 我做错了什么 不执行后面的代码行 我已经使用 ls 和 cat 命令测试了
  • 使用公式内现有单元格的值

    我正在使用 Excel 2010 中的 相机 功能 我的目标是有一个单元格 其中有一个我可以手动输入的日期 并且在其下方 公式将获得更新的值 该值代表另一个 Excel 文件中的工作表名称 并向我显示更新的屏幕截图 例如 细胞A1 has
  • 如何隐藏 VS Code 中的状态栏?

    如何隐藏 Visual Studio Code 中的状态栏 应该可以隐藏状态栏 有什么办法可以隐藏它吗 在 查看 菜单中 我找不到隐藏它的选项 View gt Appearance gt Show Status Bar Screenshot
  • subprocess.wait() 不等待 Popen 进程完成(使用线程时)?

    我在使用时遇到一些问题subprocess Popen 使用线程从我的 python 脚本生成同一应用程序的多个实例 使它们同时运行 在每个线程中 我使用以下命令运行应用程序popen 调用 然后我通过调用等待它完成wait 问题似乎在于w