Python 中 subprocess.PIPE 的非阻塞读取

2024-02-13

我正在使用子流程模块 http://docs.python.org/library/subprocess.html启动子进程并连接到其输出流(标准输出)。我希望能够在其标准输出上执行非阻塞读取。有没有办法使 .readline 非阻塞或在调用之前检查流上是否有数据.readline?我希望它是可移植的或者至少可以在 Windows 和 Linux 下工作。

这是我现在的做法(它阻止了.readline如果没有可用数据):

p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
output_str = p.stdout.readline()

fcntl https://stackoverflow.com/questions/375427/non-blocking-read-on-a-stream-in-python/4025909#4025909, select https://stackoverflow.com/questions/375427/non-blocking-read-on-a-stream-in-python/375511#375511, asyncproc https://stackoverflow.com/questions/375427/non-blocking-read-on-a-stream-in-python/437888#437888在这种情况下没有帮助。

无论操作系统如何,无阻塞地读取流的可靠方法是使用Queue.get_nowait() https://docs.python.org/3/library/queue.html#queue.Queue.get_nowait:

import sys
from subprocess import PIPE, Popen
from threading  import Thread

try:
    from queue import Queue, Empty
except ImportError:
    from Queue import Queue, Empty  # python 2.x

ON_POSIX = 'posix' in sys.builtin_module_names

def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()

p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1, close_fds=ON_POSIX)
q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True # thread dies with the program
t.start()

# ... do other things here

# read line without blocking
try:  line = q.get_nowait() # or q.get(timeout=.1)
except Empty:
    print('no output yet')
else: # got line
    # ... do something with line
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中 subprocess.PIPE 的非阻塞读取 的相关文章

  • 通过 Python 与 Windows 控制台应用程序交互

    我在 Windows 上使用 python 2 5 我希望通过 Popen 与控制台进程交互 我目前有一小段代码 p Popen console app exe stdin PIPE stdout PIPE issue command 1
  • 如何测试顶级窗口是否打开?

    我感觉 Python 编程可能不是我的菜 我创建了一个 tkinter GUI 它使用按钮回调来打开另一个窗口 其他搜索说这个窗口应该是顶级窗口 并且它工作得很好 但是每次按下按钮时它都会打开另一个相同的窗口 如据我所知 窗口 问题 如何测
  • OpenCV Python 删除图像中的某些对象

    我正在使用带有 opencv 和 numpy 的 python 来检测天文中的星星 例如这个1 https i stack imgur com AKwEJ jpg图片 使用模板匹配 我可以用阈值检测星星 单击 2 2 https i sta
  • 使用 GeoDjango 在坐标系之间进行转换

    我正在尝试将坐标信息添加到我的数据库中 添加django contrib gis支持我的应用程序 我正在写一个south数据迁移 从数据库中获取地址 并向 Google 询问坐标 到目前为止 我认为我最好的选择是使用geopy为了这 接下来
  • Python 中的二进制相移键控

    我目前正在编写一些代码 以使用音频转换通过激光传输消息 文件 和其他数据 我当前的代码使用 python 中 binascii 模块中的 hexlify 函数将数据转换为二进制 然后为 1 发出一个音调 为 0 发出不同的音调 这在理论上是
  • 用于打印 C/C++ 文件的所有函数定义的 Python 脚本

    我想要一个 python 脚本来打印 C C 文件中定义的所有函数的列表 e g abc c定义两个函数为 void func1 int func2 int i printf d i return 1 我只想搜索文件 abc c 并打印其中
  • 在 C# 中实例化 python 类

    我已经用 python 编写了一个类 我想通过 IronPython 将其包装到 net 程序集中 并在 C 应用程序中实例化 我已将该类迁移到 IronPython 创建了一个库程序集并引用了它 现在 我如何真正获得该类的实例 该类看起来
  • 用 C 语言进行非阻塞 udp 套接字编程:我能得到什么?

    我在理解从非阻塞 UDP 套接字返回什么recv recvfrom 时遇到问题 与 TCP 相比更具体一点 如果我错了 请纠正我 阻塞套接字 TCP 或 UDP 在缓冲区中有一些数据之前不会从 recv 返回 这可以是一定数量的字节 TCP
  • 打印一个 Jupyter 单元中定义的所有变量

    有没有一种更简单的方法来以漂亮的方式显示单个单元格中定义的所有变量的名称和值 我现在做的方式是这样的 但是当有30个或更多变量时我浪费了很多时间 您可以使用whos http ipython readthedocs io en stable
  • Docker:通过 Gunicorn 运行 Flask 应用程序 - Worker 超时?表现不佳?

    我正在尝试创建一个用Python Flask编写的新应用程序 由gunicorn运行 然后进行dockerized 我遇到的问题是 docker 容器内的性能非常差 不一致 我最终得到了响应 但我不明白为什么性能会下降 有时我会在日志中看到
  • Python/Flask:应用程序在关闭后正在运行

    我正在开发一个简单的 Flask Web 应用程序 我使用 Eclipse Pydev 当我开发该应用程序时 由于代码更改 我必须经常重新启动该应用程序 这就是问题所在 当我运行该应用程序时 我可以在本地主机上看到该框架 这很好 但是当我想
  • Selenium 网页抓取与动态内容和隐藏数据表上的美丽汤

    真的需要这个社区的帮助 我正在使用 Selenium 和 Beautiful Soup 对 Python 中的动态内容进行网页抓取 问题是定价数据表无法解析为 Python 即使使用以下代码 html browser execute scr
  • Python将csv数据导出到文件中

    我有以下运行良好的代码 但我无法修剪数据并将其存储在数据文件中 import nltk tweets love this car this view amazing not looking forward the concert def g
  • Python:使用列表创建二叉搜索树

    我的代码的目标是从 txt 文件中获取每个单独的单词并将其放入列表中 然后使用该列表创建二叉搜索树来计算每个单词的频率 并按字母顺序打印每个单词及其频率 中的每个单词只能包含字母 数字 或 我无法用我的初学者编程知识来做的部分是使用我拥有的
  • 通过套接字发送字符串(python)

    我有两个脚本 Server py 和 Client py 我心中有两个目标 能够从客户端一次又一次地向服务器发送数据 能够将数据从服务器发送到客户端 这是我的 Server py import socket serversocket soc
  • Pandas - 分割大的Excel文件

    我有一个大约有 500 000 行的 Excel 文件 我想将其拆分为多个 Excel 文件 每个文件有 50 000 行 我想用熊猫来做 这样它会是最快和最简单的 有什么想法如何制作吗 感谢您的帮助 假设您的 Excel 文件只有一个 第
  • 通过子类化 `io.TextIOWrapper` 来子类化文件 - 但它的构造函数有什么签名?

    我正在尝试子类化io TextIOWrapper下列的这个帖子 https stackoverflow com a 23796737 974555 虽然我的目标不同 以此开始 注意 动机 https stackoverflow com a
  • 如何在 Python 中解析损坏的 XML?

    我无法影响的服务器发送的 XML 非常损坏 具体来说 Unicode WHITE STAR 将被编码为 UTF 8 E2 98 86 然后使用 Latin 1 转换为 HTML 实体表 我得到的是 acirc 98 86 9 个字节 位于声
  • Python 中的 C 指针算术

    我正在尝试将一个简单的 C 程序转换为 Python 但由于我对 C 和 Python 都一无所知 这对我来说很困难 我被 C 指针困住了 有一个函数采用 unsigned long int 指针并将其值添加到 while 循环中的某些变量
  • 使用Python的timeit获取“全局名称'foo'未定义”

    我想知道执行一条Python语句需要多少时间 所以我上网查了一下 发现标准库提供了一个名为timeit http docs python org library timeit html旨在做到这一点 import timeit def fo

随机推荐

  • 减少频繁重新部署(上传)到远程服务器的战争规模

    在开发过程中 我需要经常更新我的 Web 应用程序源代码并将更新后的 war 部署到远程 Tomcat 服务器 在我的连接上上传大型战争 25MB 需要太长时间 大约 30 分钟 效率非常低 有什么办法可以减少战争规模吗 我的项目中有很多外
  • CSS:浮动时忽略div高度

    I m trying to display some pictures All of them have the same width but different height I m trying to do something like
  • 在不同 Perl 版本下运行的程序之间传递对象

    使用从 perl5 6 pl 到 perl5 24 pl 的不同 perl 版本将对象作为输入参数传递时遇到问题 无法从函数 from 5 24 获取返回值 下面提供了有问题的代码 使用windows平台 如何解决这个问题 SharedBe
  • 从 .un~ 文件恢复 vim 文件,无需撤消命令

    如何从 vim 文件恢复undo不点击文件undo 我有一个在添加文本时保存的 vim 文件 然后我运行了一个 python 命令来清空文件的内容 我可以看到文件中包含的一些单词 un 文件 当我尝试在文件中撤消时 它说Already at
  • Java HttpURLConnection 使用 SOCKS 代理而不是 HTTP

    我有一个非常简单的代码 使用 HttpURLConnection 通过代理访问某个网站 System setProperty java net useSystemProxies true System out println Proxy P
  • 如何对项目中的单个文件禁用 ARC?

    我在我的项目中成功使用了 ARC 然而 我遇到了一些文件 例如 在单元测试和模拟对象中 其中 ARC 的规则现在有点脆弱 我记得听说有一种方法可以在每个文件的基础上禁用 ARC 尽管我一直找不到这个选项 这可能吗 如何针对每个文件禁用 AR
  • 下面代码的时间复杂度是多少?

    sum 0 for int i 1 i
  • WPF TextBlock 红色负数

    我试图找出创建样式 触发器以将前景设置为红色 当值 如果您没有使用 MVVM 模型 您可能有 ForegroundColor 属性 那么最简单的方法就是创建一个新的 IValueConverter 将您的背景绑定到您的值 在 MyWindo
  • 使用 Docker Desktop 的 WSL2 上的 Docker 卷

    我刚刚在 Windows 上使用 Docker 尝试 WSL 2 但在安装卷时遇到了问题 version 3 7 services node build container name node hostname node volumes a
  • 如何使用Qt获取wifi信号强度?

    到目前为止 我可以使用 QNetworkConfigurationManager allConfigurations 扫描所有可用的 wifi 但是每个的 QNetworkConfiguration 数据都没有 wifi 信号强度 你能告诉
  • Swift 类/结构隐式符合 NSObjectProtocol?

    不久前我遇到了奇怪的 Swift 问题 当我尝试在调试中将 Swift 对象转换为 NSObjectProtocol 时 它执行成功 但是当这段代码在 AppStore 构建中执行时 它会转换为 nil import Foundation
  • 使用c++禁用任务切换键

    我已经做了很多搜索 但没有真正的解决方案 针对我自己的问题 所以我想我会在这里问 我正在设计一个类似信息亭的程序 防止用户在程序运行时使用任务键 alt tab alt esc ctrl esc 等 请注意 我是一名新手程序员 因此如果可以
  • 数据库DateTime毫秒和纳秒如果为0则默认被截断,而在Java 11中使用ZonedDateTime时使用它

    我正在从 Oracle 数据库中获取日期时间并进行解析Java 11 https en wikipedia org wiki Java version history Java 11使用 ZonedDateTime 如下 甲骨文 gt 1
  • TypeScript TSConfig CompilerOptions ES2017 目标和库

    我正在开发一个 TypeScript 项目 我们使用 ES2017 作为输出目标以及其中一个库 因为它将通过 Babel 并且我们希望支持任何 Env 的最新功能集我们的目标是巴别塔 一切似乎都很顺利 所以我不太担心 然而 我不知道幕后发生
  • C#程序中的System.IO.Compression.FileSystem.dll

    我喜欢使用 dll系统 IO 压缩 文件系统 dll http msdn microsoft com en us library system io compression zipfile aspx在我的项目中 the net framew
  • vuejs 根据数据条件绑定一个类

    有人可以告诉我我做错了什么吗 我试图根据数据模型中是否显示是或否来绑定类 我已经尝试过条件绑定 但我想也许我缺少一个参数或者以错误的方式处理这个问题 我缺少什么 我希望 css 一月类绑定到表 如果 v bind 已经存在 我如何触发 v
  • ECMAScript6 AngularJS 过滤器

    我在项目中使用 ECMAScript6 并尝试创建角度过滤器 以下是我的尝试 但是我在控制台中收到以下错误 无法设置未定义的属性 PassFilter 我对 ES6 和 Angular 都是新手 由于遗留的限制 我不得不以这种方式引导角度
  • 如何比较两个 JSON 具有相同的属性而无需排序?

    我尝试比较这两个 JSON 对象
  • 使用 C# 驱动程序从 mongodb 检索数据

    我在我的测试项目中使用 C 的官方 mongodb 驱动程序 并且我已经将文档从 C Web 应用程序插入到 mongodb 在 mongo 控制台中 db blog find 可以显示我插入的条目 但是当我尝试检索它们时 net 抛出异常
  • Python 中 subprocess.PIPE 的非阻塞读取

    我正在使用子流程模块 http docs python org library subprocess html启动子进程并连接到其输出流 标准输出 我希望能够在其标准输出上执行非阻塞读取 有没有办法使 readline 非阻塞或在调用之前检