子进程超时失败

2024-04-20

我想在子进程上使用超时

 from subprocess32 import check_output
 output = check_output("sleep 30", shell=True, timeout=1)

不幸的是,虽然这会引发超时错误,但它会在 30 秒后发生。看来 check_output 不能中断 shell 命令。

我可以在 Python 端做什么来阻止这种情况? 我怀疑 subprocess32 未能杀死超时进程。


check_output()超时本质上是 https://github.com/python/cpython/blob/268c20ef6920651b440f827a93efa8887dcba99f/Lib/subprocess.py#L604-L610:

with Popen(*popenargs, stdout=PIPE, **kwargs) as process:
    try:
        output, unused_err = process.communicate(inputdata, timeout=timeout)
    except TimeoutExpired:
        process.kill()
        output, unused_err = process.communicate()
        raise TimeoutExpired(process.args, timeout, output=output)

有两个问题:

  • [第二].communicate()可能会等待后代进程,而不仅仅是直接子进程,请参阅Python 子进程 .check_call 对比 .check_output https://stackoverflow.com/q/36169571/4279
  • process.kill()可能不会杀死整个进程树,请参阅如何终止使用 shell=True 启动的 python 子进程 https://stackoverflow.com/q/4789837/4279

它导致了您观察到的行为:TimeoutExpired发生在一秒钟内,外壳被杀死,但是check_output()孙子后30秒才返回sleep进程退出。

要解决这些问题,请终止整个进程树(属于同一组的所有子进程):

#!/usr/bin/env python3
import os
import signal
from subprocess import Popen, PIPE, TimeoutExpired
from time import monotonic as timer

start = timer()
with Popen('sleep 30', shell=True, stdout=PIPE, preexec_fn=os.setsid) as process:
    try:
        output = process.communicate(timeout=1)[0]
    except TimeoutExpired:
        os.killpg(process.pid, signal.SIGINT) # send signal to the process group
        output = process.communicate()[0]
print('Elapsed seconds: {:.2f}'.format(timer() - start))

Output

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

子进程超时失败 的相关文章

  • C++ 相当于 Python getattr

    在Python中 有一个名为getattr的函数 它看起来像这样 class MyObject def init self self xyz 4 obj MyObject getattr obj xyz 其中对 getattr 的调用将返回
  • 有没有办法离线将多个 Plotly HTML 文件合并/嵌入到一个页面/HTML 文件中?

    我正在尝试将多个图表合并成一个 HTML 报告来发送 问题是我真的不认为子图是最好的主意 因为图表相对不相关 不同的 X Y 轴 我所需要做的只是将图表附加到 1 个 HTML 文件中 有一个指南解释了如何使用绘图 URL 来完成此操作 但
  • Python:我可以修改元组吗?

    我有一个 2 D 元组 实际上我以为 它是一个列表 但错误说它是一个元组 但无论如何 该元组的形式为 浮点数 val prod id 现在我有一个字典 其中包含 key gt prod id 和 value prod name 现在 我想将
  • Python中的键盘可中断阻塞队列

    It seems import Queue Queue Queue get timeout 10 键盘可中断 ctrl c 而 import Queue Queue Queue get 不是 我总是可以创建一个循环 import Queue
  • 使用 Python 连接从 FTP 检索文件

    我构建了这个简单的工具来暴力破解并连接到 ftp 服务器 import socket import ftplib from ftplib import FTP port 21 ip 192 168 1 108 file1 passwords
  • 如何在Python中通过URL下载Azure Blob存储文件?

    我正在尝试从我的存储帐户下载 Azure Blob 存储文件 为此 我检查了 URL 是什么 并且正在执行以下操作 with urllib request urlopen
  • python 正则表达式中括号的奇怪行为

    我正在编写一个 python 正则表达式 它可以在文本文档中查找引用的字符串 从黑匣子中记录的航空公司飞行员的引用 我首先尝试编写具有以下规则的正则表达式 返回引号之间的内容 如果以 single 打开 则仅在以 single 关闭时返回
  • 为什么我在 Python 中收到“连接被拒绝”错误? (插座)

    我是套接字新手 请原谅我完全缺乏理解 我有一个服务器脚本 server py usr bin python import socket import the socket module s socket socket Create a so
  • PyKCS11 不可哈希列表

    我的 python 脚本旨在获取特定 so 库中插槽 令牌的详细信息 输出如下所示 Library manufacturerID Safenet Inc Available Slots 4 Slot no 0 slotDescription
  • Unpickle 二进制文件为文本[重复]

    这个问题在这里已经有答案了 我需要对基本上如下所示的系统进行一些维护 复杂的遗留Python程序 gt 二进制pickle文件 gt 另一个复杂的遗留Python程序 这需要准确弄清楚中间 pickle 文件中的内容 我怀疑文件格式比生成和
  • Python lmfit:拟合 2D 模型

    我正在尝试将二维高斯拟合到一些灰度图像数据 该数据由一个二维数组给出 lmfit 库实现了一个易于使用的模型类 它应该能够做到这一点 不幸的是文档 http lmfit github io lmfit py model html http
  • 如何在 PyCharm 中启用 flake8 的自动代码格式化

    我使用 Tox 运行单元测试 并使用 flake8 命令检查代码格式错误 每次我在 PyCharm 中编码时 我都会运行 tox 然后意识到我有一堆烦人的格式错误 我必须返回并手动修复 我希望 PyCharm 自动格式化代码 根据 flak
  • OpenCV 在使用 anaconda 的 Linux 上无法与 python 正常工作。收到 cv2.imshow() 未实现的错误

    这就是我得到的确切错误 我的操作系统是 Ubuntu 16 10 OpenCV 错误 未指定错误 该功能未实现 使用 Windows GTK 2 x 或 Carbon 支持重新构建库 如果您使用的是 Ubuntu 或 Debian 请安装
  • 将 pandas DataFrame 与 Series 进行比较

    我看过this https stackoverflow com questions 26285661 working with comparing dataframes and series and generating new dataf
  • 如何在 Python 中重命名文件并保留创建日期

    我知道创建日期不存储在文件系统本身中 但是当我使用时我遇到了问题os rename 它正在更新我正在使用的文件的创建日期 是否可以重命名文件而不更改其原始创建日期 正如都铎所说 你可以使用os stat http docs python o
  • 有没有办法在Python中调用子类定义的方法?

    The init 方法定义了创建类的实例时要执行的操作 创建子类时我可以做类似的事情吗 假设我有抽象类Entity class Entity def onsubclasscreation cls for var in cls annotat
  • 让垂直网格线出现在 matplotlib 的线图中

    我想在绘图上同时获得水平和垂直网格线 但默认情况下仅显示水平网格线 我正在使用一个pandas DataFrame从 python 中的 sql 查询生成 x 轴上带有日期的线图 我不知道为什么它们没有出现在日期上 我试图寻找这个问题的答案
  • 结束一天(日期时间)的最优雅的方式是什么?

    我目前正在编写一些报告代码 允许用户选择指定日期范围 它的工作方式 简化 是 用户 可选 指定年份 用户 可选 指定月份 用户 可选 指定一天 这是一个代码片段 以及描述我想要的内容的注释like to do from datetime i
  • 为什么这个记忆器适用于递归函数?

    我不明白为什么下面的代码是这样的fib以线性而非指数时间运行 def memoize obj Memoization decorator from PythonDecoratorLibrary Ignores kwargs cache ob
  • jupyter run magic 将参数传递给笔记本

    当您在第一个 jupyter 笔记本 first ipynb 中时 您可以执行第二个 但如何传递参数呢 假设第二个有以下内容 xx 10 您可以从第一个调用第二个 如下所示 run second ipynb xx will print 10

随机推荐

  • 按钮事件在 Firefox 操作系统中不起作用

    function listContents storagename alert inside function Clear up the list first results html var files navigator getDevi
  • 仅当 gradle 中另一个任务不是最新时才运行任务

    我想在 Gradle 中进行功能测试时自动添加 serverRun 任务 因此我添加了一个依赖项 funcTestTask dependsOn serverRun 无论 funcTestTask 是否运行 任务都会运行 compile se
  • 如何使用敏感数据运行 cron 作业?

    I read 在哪里可以设置 crontab 将使用的环境变量 https stackoverflow com questions 2229825 where can i set environment variables that cro
  • 如何正确使用CGPathApply

    我尝试使用 CGPathApply 迭代 CGPathRef 对象中的每个 CGPathElement 主要是编写一种自定义方法来保存 CGPath 数据 问题是 每次调用 CGPathApply 时 我的程序都会崩溃 根本没有任何信息 我
  • WebLogic Server 10.3.6 中的 JPA 2.0

    我需要使用 JPA 2 0 带有 EclipseLink 实现 问题是我还需要在实现 Java EE 5 规范的 WebLogic 10 3 6 服务器中部署此应用程序 因此不需要支持 JPA 2 我知道有可用于在此版本中添加对 JPA 2
  • 参数列表中的 void_t 可以工作,但不能作为返回类型

    cppreference 上有一个关于使用别名的示例 这个例子失败是因为int没有会员foo template
  • 使用 Apache2 的 NodeJS 应用程序有时会返回 503 服务器不可用

    风景 我有一个乌班图18 04DigitalOcean 中的服务器具有以下规格 1 vCPUs 1GB and 25GB磁盘 在这个服务器 我们称之为 API SERVER 中 我使用 PHP 和 NodeJS 在由 apache 管理的代
  • 何时处置?

    我对所有有关 IDispose 和 使用 语句的讨论感到困惑 我想知道是否有人可以告诉我在下面的测试示例中是否需要使用 using 语句或 IDispose 的某种实现 public class Main MyFile myFile new
  • resharper 单元测试继承

    有人有 Resharper 单元测试层次结构的策略吗 我通常使用 TestDriven Net 和 Resharper 的测试运行器以及 NUnit 测试 TestDriven 对所有事情都很棒 但很快就会从批量运行 可能是数千个 中找到一
  • WordPress 博客文章未显示 Facebook 预览图像

    我有一篇博客文章here http gingerslist com blog 62 smiles and understanding 2 当我在 Facebook 上分享此内容时 预览图像不显示 我尝试过重新抓取Facebook 开发者工具
  • 使用 SQLAlchemy 批量更新插入 [重复]

    这个问题在这里已经有答案了 我正在使用 SQLAlchemy 1 1 0b 将大量数据批量插入到 PostgreSQL 中 并且遇到了重复的键错误 from sqlalchemy import from sqlalchemy orm imp
  • 何时应使用以下各项:Amazon EC2、Google App Engine、Microsoft Azure 和 Salesforce.com? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是在非常普遍的意义上问这个问题 无论是从云提供商还是云消费者的角度来看 此外 问题不针对任何特定类型的应用程序 实际上 目的是了解哪种类型的应
  • 在 iPhone 中的应用程序中评价我在 iTunes 中的应用程序

    我必须在我的应用程序中提供一个链接 用户点击它就会将我带到应用程序的 itunes Appstore 页面 用户可以在其中对应用程序进行评分 我认为其他应用程序尝试访问设备中的Appstore应用程序并在itunes中传递该应用程序的相应u
  • PowerShell 5 中的写入主机与写入信息

    众所周知 Write Host是邪恶的 在PowerShell 5 Write Information被添加并被考虑替换Write Host 但是 说实话 哪个更好呢 Write Host是邪恶的 因为它不使用管道 因此输入消息无法被重用
  • 如何使用Android KeyStore安全存储任意字符串?

    我希望能够在 Android KeyStore 中安全地存储一些敏感字符串 我从服务器获取字符串 但我有一个用例需要我保留它们 KeyStore 只允许从与分配给我的应用程序相同的 UID 进行访问 并且它将使用设备主密码对数据进行加密 因
  • R Shiny Memory Leak - 有关如何查找的建议?

    我正在寻找有关如何识别 R 闪亮程序中内存泄漏的一般想法 我正在努力确定泄漏的确切位置 因此很难重新创建 而且我的代码已经超过 1000 行 我确信它与观察和观察事件有关 但我无法准确指出它 我实际上很喜欢 bborgeser 在这里提出的
  • 如何根据iOS上的touchMove事件在屏幕上绘制动态矩形

    矩形将被视为两个点 第一个点将是 touchBegan 点 在 touchMove 上将是第二个点 矩形将根据用户手指的移动动态绘制 就像当您单击桌面并移动桌面时 鼠标您将获得动态矩形 Thanks 好的 这是你如何绘制矩形的方法touch
  • 如何展平嵌套的Python字典?

    我正在尝试展平嵌套字典 dict1 Bob shepherd 4 6 3 collie 23 3 45 poodle 2 0 6 Sarah shepherd 1 2 3 collie 3 31 4 poodle 21 5 6 Ann sh
  • 尽管确实存在,但“不存在具有给定标识符的行”

    我正在使用 Hibernate 并得到 线程 main 中的异常 org hibernate ObjectNotFoundException 不存在具有给定标识符的行 271 这个错误的奇怪之处在于 具有给定 id 的对象存在于数据库中 我
  • 子进程超时失败

    我想在子进程上使用超时 from subprocess32 import check output output check output sleep 30 shell True timeout 1 不幸的是 虽然这会引发超时错误 但它会在