如何从 subprocess.communicate() 捕获 python 中的流输出

2023-12-13

目前,我有这样的事情:

self.process = subprocess.Popen(self.cmd, stdout=subprocess.PIPE)
out, err = self.process.communicate()

我正在运行的命令会流式传输输出,并且我需要在继续之前阻止该进程。

如何才能捕获流输出并通过标准输出打印流输出?当我设置stdout=subprocess.PIPE,我可以捕获输出,但不会打印输出。如果我遗漏了stdout=subprocess.PIPE,它打印输出,但是communicate()将返回None.

有没有一种解决方案可以满足我的要求,同时提供阻塞直到进程终止/完成并避免提到的缓冲区问题和管道死锁问题here?

Thanks!


我可以想到一些解决方案。

#1:你可以直接进入源代码来获取的代码communicate,复制并粘贴它,添加代码来打印每一行,并缓冲内容。 (如果对你自己来说可能的话stdout例如,由于父级陷入僵局而阻塞,您可以使用threading.Queue或其他东西。)这显然有点 hacky,但它非常简单,而且很安全。

但实际上,communicate很复杂,因为它需要完全通用,并处理您不具备的情况。这里你所需要的只是核心技巧:抛出线程来解决问题。专用的读取器线程,不会执行任何缓慢或阻塞的操作read通话就是您所需要的。

像这样的事情:

self.process = subprocess.Popen(self.cmd, stdout=subprocess.PIPE)
lines = []
def reader():
    for line in self.process.stdout:
        lines.append(line)
        sys.stdout.write(line)
t = threading.Thread(target=reader)
t.start()
self.process.wait()
t.join()

您可能需要一些错误处理reader线。我不能 100% 确定您可以安全地使用readline这里。但这要么有效,要么接近。

#2:或者您可以创建一个包装类,它接受一个文件对象和 teesstdout/stderr每次有人read是从它。然后手动创建管道,并传入包裹的管道,而不是使用 automagicPIPE。这与#1 具有完全相同的问题(意味着要么没有问题,要么您需要使用Queue或者如果sys.stdout.write可以阻止)。

像这样的事情:

class TeeReader(object):
    def __init__(self, input_file, tee_file):
        self.input_file = input_file
        self.tee_file = tee_file
    def read(self, size=-1):
        ret = self.input_file.read(size)
        if ret:
            self.tee_file.write(ret)
        return ret

换句话说,它包装了一个文件对象(或类似文件对象的东西),并像文件对象一样工作。 (当你使用PIPE, process.stdout是 Unix 上的真实文件对象,但可能只是在 Windows 上起作用。)您需要委托给的任何其他方法input_file可以直接委托,无需任何额外的包装。要么尝试这个,看看有什么方法communicate gets AttributeException明确地寻找并编码这些内容,或者执行通常的操作__getattr__委派一切的技巧。 PS,如果您担心这个“文件对象”的想法意味着磁盘存储,请阅读一切都是文件在维基百科。

#3:最后,您可以获取 PyPI 上的“异步子进程”模块之一或包含在twisted或其他异步框架并使用它。 (这使得possible以避免死锁问题,但事实并非如此保证—您仍然必须确保正确维修管道。)

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

如何从 subprocess.communicate() 捕获 python 中的流输出 的相关文章

  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • 如何使用 Ansible playbook 中的 service_facts 模块检查服务是否存在且未安装在服务器中?

    我用过service facts检查服务是否正在运行并启用 在某些服务器中 未安装特定的软件包 现在 我如何知道这个特定的软件包没有安装在该特定的服务器上service facts module 在 Ansible 剧本中 它显示以下错误
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • 在事件循环中共享队列

    是否可以在一个事件循环中的不同任务上共享 asyncio Queue 用例 两项任务正在队列上发布数据 一项任务正在从队列中获取新项目 所有任务都以异步方式进行 main py import asyncio import creator a
  • android numberpicker索引出界旋转

    我正在尝试创建一个自定义时间选择器 但遇到的问题是当我旋转屏幕时 另外 如果我按主页按钮离开应用程序 当我返回时出现相同的错误时 它会崩溃 public class MyTimePicker extends RelativeLayout p
  • 如何让执行 PHP 脚本的 Cronjob 运行时间超过 30 秒?

    我如何将其重写为每天运行超过 30 秒的 cron 另外 我需要编辑 htaccess or php ini文件在cron php目录说些什么 在浏览器上 它可以正常运行 30 秒以上 在外壳上 它也运行得很好 但作为一个 cron 设置的
  • 如何在 Eclipse 中使用引用的项目

    好吧 也许每个人都知道如何做到这一点 但我从来没有尝试过 因为我从来没有需要它 所以 你如何在 Eclipse 中处理多个引用的项目 我有几个 Struts 1 Web 应用程序 它们必须使用另一个 struts 1 库 项目 现在我正在使
  • 如何排除 Maven 插件中的依赖关系?

    我有一个项目需要以下 Maven jibx 插件
  • 在另一个 JNI 函数中使用时 Oop 被损坏

    问题是我们可以缓存吗jclass and jmethodID跨不同的 JNI 方法调用 当尝试使用缓存创建某个特定类的对象时 我遇到了一些奇怪的行为jclass and jmethodID来自另一个 JNI 方法调用 这是一个简单的例子 p
  • 在哪里可以找到一个好的 JavaScript/HTML AutoSuggest 示例 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找 JavaScr
  • 从派生类访问基类中的类型别名[重复]

    这个问题在这里已经有答案了 当尝试从派生类访问基类中的类型别名时 我面临以下问题 template
  • WebView动态插入/修改内容

    在我的应用程序中 我使用 WebView 来显示内容 现在是否可以动态修改内容 需求是这样的 我将从网络获取信息 并根据它们我需要设置样式 字体 属性 或者当连接的设备没有响应时我可能需要附加新文本 到目前为止我正在使用以下代码 void
  • Java webstart max-heap-size导致JVM无法启动

    我们在客户端使用 java web start 来构建基于 java swing 的应用程序 最近 当单击 jnlp 链接时 我们遇到了一个奇怪的 无法启动 java 虚拟机 错误 我们很快就发现了这一点 因为 jnlp 文件中的 max
  • 如何解决循环引用?

    如何解决循环引用问题 例如 A 类将 B 类作为其属性之一 而 B 类将 A 类作为其属性之一 架构师该如何解决这类问题呢 如果以NHibernate为例 对象之间就会存在父子关系 它如何处理这些父子场景 在大多数情况下 当我必须让两个事物
  • 使用 Paramiko 将文件从远程目录复制到远程子目录

    如何复制远程服务器中的文件 maindir fil1 txt到子目录 maindir subdir file1 txt 我使用 SFTP 实现paramiko 但它总是检查要复制的本地路径 filename full path maindi
  • 未找到类定义错误 (android)

    我正在开发一个应用程序 我可以启动我的启动器活动 它有两个按钮 单击这些按钮中的任何一个时 都应该打开一个新活动 但是 随后会发生运行时错误 import android app Activity import android conten
  • 禁用 Laravel 内置的错误处理方法

    有没有办法一起禁用 Laravel 错误处理程序 我想简单地显示标准 PHP 错误 not the Whoops looks like something went wrong errors 这会严重违反框架的原则 如果您仍然感兴趣 我将在
  • 连接具有不同数据类型的两个表 MS ACCESS -“表达式中的类型不匹配”错误

    我正在尝试使用两个实时 CSV 运行访问查询 这两个 CSV 具有不同数据类型 数字和短文本 的公共字段 我发现您可以使用 CStr 连接不同的数据类型 我已将 CStr 添加到 sql 视图上的代码中 请找到下面的代码 这为我提供了我想要
  • 如何在Windows Phone中创建SESSION

    string uname txt1 Text string pwd txt2 Text NavigationService Navigate new Uri newPage xaml name uname pwd pwd UriKind R
  • 使用 Swift 在一个 ViewController 中强制横向模式

    我试图在横向模式下仅强制我的应用程序中的一个视图 我正在打电话 override func shouldAutorotate gt Bool print shouldAutorotate return false override func
  • AVFoundation 重现视频循环

    我需要在 OpenGL 应用程序中无限期地重现视频 视频结束时重新启动 为此 我尝试利用 AV 基础 我创建了一个 AVAssetReader 和一个 AVAssetReaderTrackOutput 并利用 copyNextSampleB
  • 从文本中获取CGPath

    海吉同志们 我目前正在尝试将一个字母和 或多个字母转换为 CGPathRef 以便手动将它们绘制到自定义 UIView 中 我尝试了 CoreText 和 Framesetters 的方法 包括这个小片段 但它似乎不起作用 NSAttrib
  • 如何从 subprocess.communicate() 捕获 python 中的流输出

    目前 我有这样的事情 self process subprocess Popen self cmd stdout subprocess PIPE out err self process communicate 我正在运行的命令会流式传输输