捕获 subprocess.run() 的输出并实时打印它?

2023-12-22

我想使用运行命令subprocess.run()然后将其 stdout/stderr 作为字符串获取,但我希望子进程在运行时也能正常将其输出打印到控制台。如果我做

result = subprocess.run(['ls', '-al'])

然后我可以看到打印到控制台的输出,但在命令运行后我无法访问输出。如果我做

result = subprocess.run(['ls', '-al'], capture_output=True, text=True)

我可以访问result.stdout and result.stderr但命令运行时控制台上不会打印任何内容。我可以同时打印到控制台并保存到result.stdout?


从文档subprocess.run https://docs.python.org/3/library/subprocess.html#subprocess.run :

运行 args 描述的命令。等待命令完成,然后返回 CompletedProcess 实例。
[...]
If 捕获输出为 true 时,stdout 和 stderr 将被捕获。使用时,内部 Popen 对象会自动创建stdout=PIPE and stderr=PIPE.

的文档subprocess.PIPE https://docs.python.org/3/library/subprocess.html#subprocess.PIPE say :

可以用作特殊值stdin, stdout or stderr论证Popen https://docs.python.org/3/library/subprocess.html#subprocess.Popen并指示应打开通往标准流的管道。对于 Popen.communicate() 最有用。

该文档为Popen构造函数 https://docs.python.org/3/library/subprocess.html#popen-constructor范围stdout :

stdin、stdout 和 stderr 分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值为 PIPE、DEVNULL、现有文件描述符(正整数)、现有文件描述符文件对象 https://docs.python.org/3/glossary.html#term-file-object, and None.

所以使用capture_output=True是不行的,因为输出将存储在管道中供您读取after通话结束。

更简单的供您使用subprocess.Popen https://docs.python.org/3/library/subprocess.html#popen-constructor正如@MatBBastos建议的那样,你可以communicate https://docs.python.org/3/library/subprocess.html#subprocess.Popen.communicate(反复发送内容到stdin并从接收内容stdout/stderr). The 解决方案链接 https://stackoverflow.com/a/4417735/11384184有点过时了(参见它自己的评论;Python 2),但应该可以很好地工作。一个相关的解决方案是这个。

继续使用subprocess.run,您必须提供文件描述符 as stdout参数,其中我不知道怎么办必须重定向到文件对象 https://docs.python.org/3/glossary.html#term-file-object这就是你想要的:写入标准流,但也在内存中保留一个副本以供以后使用。
有文档在io https://docs.python.org/3/library/io.html模块,并且 Stack Overflow 上有很多关于做类似事情的问题,但它明显比其他方式更困难。

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

捕获 subprocess.run() 的输出并实时打印它? 的相关文章

随机推荐

  • 如何使用 F# 语法将 Type 作为属性参数传递?

    FsCheck 允许自定义Arbitrary在其 NUnit 集成中
  • Ruby 中的自然语言处理 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想做一些句子分析 主要针对 Twitter 应用程序 并推断一些一般特征 Ruby 中有针对此类事情
  • 如何在 Perl 中使用 fork() ?

    我的数组中有数百个文件名 我想为数组中的每 4 个文件创建一个子进程 并让该子进程对这 4 个文件中的每一个文件执行一些操作 因此 对于 100 个文件 我将创建 25 个进程 我在理解存在分叉时处理行的顺序时遇到一些困难 我本以为我可以做
  • Audiomanager 和 MediaPlayer 之间的区别

    谁能解释一下有什么区别AudioManager and MediaPlayer在安卓中 如果我是对的 那么AudioManager只能播放音频 而MediaPlayer可以播放音频和视频 但我相信这其中一定还有更多的内容 Thanks Au
  • 如何在 Python 中进行 Obj-C 类别?

    Obj C 我已经很长时间没有使用它了 有一个叫做类别 http macdevelopertips com objective c objective c categories html来延长课程 用新方法声明一个类别并将其编译到您的程序中
  • 如何在 Objective c 中获取当前月份的日期?

    我正在开发一个使用日期 月份 年份的应用程序 我想要当前月份的日期 因为当前月份可以有 28 29 30 31 天 我试图获取当年的月份 但我不知道上面的代码 这是我的代码 NSDateFormatter dateFormatter NSD
  • 使用 ApplicationDbContext 的身份脚手架

    ASP NET Core 2 x 现在将身份页面和逻辑隐藏在库内 为了延长IdentityUser具有新属性的实体并添加 UI 和逻辑来处理这些新属性 我们现在可以运行 身份脚手架 在 MyProject gt 添加 gt 新脚手架项下 很
  • 动态启用/禁用 jquery 可排序项目

    我的表格行可以根据是否选中某些单选按钮进行排序 可排序对象初始化于document ready如下 document ready function Return a helper with preserved width of cells
  • django 中是否有像 Rails 中那样的 before_filter ?

    django中有没有可用的功能 以便我们可以在django视图中对所有操作进行一些过滤 例如rails中可用的 before filter 我仍在学习 Rails 但从我到目前为止观察到的来看 python装饰者 http en wikip
  • GameCenter:endTurnWithNextParticipants 未前进

    在沙盒环境中 我无法将回合制比赛推进到下一个玩家 初始条件 玩家 A 和玩家 B 分别位于设备 A 和设备 B 上 两者都登录到沙箱 双方玩家都可以看到对方的GC状态信息 玩家 A 创建一场比赛并邀请玩家 B 玩家A结束回合 在我的 结束转
  • Tensorflow 错误:FailedPeconditionError:尝试使用未初始化的变量

    我想将立体图像放入优化器中 这是我的代码 tf reset default graph config learning rate 0 5 training epochs 5 init init tf global variables ini
  • 如何动态地将组件作为子组件添加到指令中?

    我一直在尝试 Angular 2 并且我已经能够通过获取现有子组件的 ViewChild 然后使用 ComponentResolver 添加我的动态组件来动态地将一个组件添加到另一个组件的子组件中 但是 如果您无法控制模板 即您动态地将组件
  • 堆叠两个具有不同列名的 SQL 表 (2008)

    我检查了这个网站的代码来堆叠两个表 将一个表的结果放在另一个表的结果下面 其中列名不同 我知道当名称相同时 UNION ALL 可以工作 并且我知道当一个表比另一个表拥有更多信息时 对一个表中缺少的列名进行赋值的 UNION ALL 可以工
  • 在 R Markdown 中跳转到某个块的快捷方式?

    是否有跳转到 R Markdown 中的某个块 在 Mac 上 的快捷方式 我正在寻找一种快速从一个块到另一个块的方法 我不完全确定这在 Mac 上是否可行 但在 Windows 版 RStudio 中 您可以选择在 IDE 中显示 文档大
  • 在nodejs中获取视频分辨率

    我一直试图找到这个问题的答案 但没有真正找到答案 如果这听起来很愚蠢或显而易见 请原谅 我有一个 Nodejs 应用程序 基本上我想简单地获取视频的分辨率 想象一下 我在磁盘上存储了一部影片 我希望能够知道它是 720p 还是 1080p
  • 如何检查Android中的UI线程是否运行? [复制]

    这个问题在这里已经有答案了 如何知道正在运行的代码是否在主线程 UI线程 上执行 对于 Swing 我使用isEventDispatchThread方法 使用Looper getMainLooper getThread 获取UI线程 您可以
  • HTTP_INTERCEPTORS 的 multi: true 属性是什么意思?

    我是 Angular 的新手 刚刚构建了一个拦截器 根据多个教程 您必须包括HTTP INTERCEPTORS in the app module像这样 providers provide HTTP INTERCEPTORS useClas
  • 图像路径在 Angular 2 中不起作用

    我放在网站上的所有内容都可以正常运行 但是我尝试放入网站的每个图像 背景除外 都会返回一个404 Not Found Error 我的所有图像都位于 Project src assets images 并且我在 html 文档中尝试了以下
  • vim 用红色突出显示所有内容

    我在执行脚本时向 python 脚本添加了一条打印行 现在当我打开文件时 所有文本都以红色突出显示 打开和关闭文件并不能消除它 打开第二个 python 文件暂时解决了问题 但随后关闭文件并重新打开又使问题再次出现 现在它根本不会消失 有谁
  • 捕获 subprocess.run() 的输出并实时打印它?

    我想使用运行命令subprocess run 然后将其 stdout stderr 作为字符串获取 但我希望子进程在运行时也能正常将其输出打印到控制台 如果我做 result subprocess run ls al 然后我可以看到打印到控