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 的非阻塞读取 的相关文章

随机推荐

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

    在开发过程中 我需要经常更新我的 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 非阻塞或在调用之前检