子进程命令的实时输出

2023-12-31

我使用 python 脚本作为流体动力学代码的驱动程序。当需要运行模拟时,我使用subprocess.Popen要运行代码,请收集输出stdout and stderr into a subprocess.PIPE--- 然后我可以打印(并保存到日志文件)输出信息,并检查是否有任何错误。问题是,我不知道代码进展如何。如果我直接从命令行运行它,它会给出有关迭代的时间、时间、下一个时间步长等的输出。

有没有办法既存储输出(用于日志记录和错误检查),又生成实时流输出?

我的代码的相关部分:

ret_val = subprocess.Popen( run_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True )
output, errors = ret_val.communicate()
log_file.write(output)
print output
if( ret_val.returncode ):
    print "RUN failed\n\n%s\n\n" % (errors)
    success = False

if( errors ): log_file.write("\n\n%s\n\n" % errors)

最初我正在管道run_command通过tee这样副本就直接进入日志文件,并且流仍然直接输出到终端——但这样我就无法存储任何错误(据我所知)。


到目前为止我的临时解决方案:

ret_val = subprocess.Popen( run_command, stdout=log_file, stderr=subprocess.PIPE, shell=True )
while not ret_val.poll():
    log_file.flush()

然后,在另一个终端中,运行tail -f log.txt (s.t. log_file = 'log.txt').


Python 3 的TLDR:

import subprocess
import sys

with open("test.log", "wb") as f:
    process = subprocess.Popen(your_command, stdout=subprocess.PIPE)
    for c in iter(lambda: process.stdout.read(1), b""):
        sys.stdout.buffer.write(c)
        f.buffer.write(c)

您有两种方法可以做到这一点,或者通过从read or readline功能并执行以下操作:

import subprocess
import sys

# replace "w" with "wb" for Python 3
with open("test.log", "w") as f:
    process = subprocess.Popen(your_command, stdout=subprocess.PIPE)
    # replace "" with b'' for Python 3
    for c in iter(lambda: process.stdout.read(1), ""):
        sys.stdout.write(c)
        f.write(c)

or

import subprocess
import sys

# replace "w" with "wb" for Python 3
with open("test.log", "w") as f:
    process = subprocess.Popen(your_command, stdout=subprocess.PIPE)
    # replace "" with b"" for Python 3
    for line in iter(process.stdout.readline, ""):
        sys.stdout.write(line)
        f.write(line)

或者您可以创建一个reader and a writer文件。通过writer to the Popen https://docs.python.org/3/library/subprocess.html#subprocess.Popen并从reader

import io
import time
import subprocess
import sys

filename = "test.log"
with io.open(filename, "wb") as writer, io.open(filename, "rb", 1) as reader:
    process = subprocess.Popen(command, stdout=writer)
    while process.poll() is None:
        sys.stdout.write(reader.read())
        time.sleep(0.5)
    # Read the remaining
    sys.stdout.write(reader.read())

这样你就可以将数据写入test.log以及标准输出。

文件方法的唯一优点是您的代码不会阻塞。因此,您可以在此期间做任何您想做的事情,并随时阅读reader以非阻塞的方式。当你使用PIPE, read and readline函数将阻塞,直到将一个字符写入管道或将一行写入管道。

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

子进程命令的实时输出 的相关文章

随机推荐

  • 利用字符串向量中的余弦相似度来过滤掉相似的字符串

    我有一个字符串向量 向量的某些字符串 可能超过两个 在它们包含的单词方面彼此相似 我想过滤掉与向量的任何其他字符串具有超过 30 余弦相似度的字符串 在被比较的两个字符串中 我希望保留包含更多单词的字符串 也就是说 我只想要那些与原始向量的
  • 请建议针对表行跨度和列跨度问题的 XSLT 代码

  • 我应该使用 window.variable 还是 var?

    我们有很多设置 JS 代码 用于定义面板 按钮等 这些代码将在许多其他 JS 文件中使用 通常 我们会做这样的事情 grid js var myGrid 组合 js var myCombo 然后 在我们的应用程序代码中 我们 应用程序 js
  • 如何获取 Gradle 项目的所有配置列表?

    我正在尝试获取所有有效值的列表 configuration的旗帜依赖洞察 https docs gradle org current userguide tutorial gradle command line html sec depen
  • 如何在没有实体和 JPA 存储库的情况下在 Spring 中运行本机 SQL 查询?

    我正在尝试在 Spring 应用程序中运行一些本机 SQL 查询 我没有实体或JpaRepository班级 我知道这很奇怪 但这是一个微服务 只是收集两个计数查询并将其发送到 Kafka 相信我 我所需要的只是查询中的这两个整数 我运行这
  • 使用 JNI 在 C++ 中调用方法?

    所以我一直在研究 JNI 调用 以便我可以与一些预先编写的 C 程序进行交互 我不了解任何 C 但我正在尝试学习一些基础知识 我刚刚尝试对 JNI 方法之外的方法进行简单调用 但总是收到以下错误 错误 c3861 myMethod 找不到标
  • CORS / xhr.getRequestHeaders

    问候 我正在尝试使用 CORS http www w3 org TR 2009 WD cors 20090317 access control allow methods header http www w3 org TR 2009 WD
  • Java regex - 从匹配文本中获取行号

    它基于我的上一个问题 https stackoverflow com questions 34758621 java get text from jtextarea by number line 对于我的情况 我想从正则表达式模式中获取行数
  • 为什么不重用“ASP.NET_SessionId”?

    我是 ASP NET 新手 我不明白为什么不重用 ASP NET SessionId 据我了解 每次用户从服务器请求页面时 IIS 都会为他创建一个 ASP NET SessionId 并将其放入用户浏览器的 cookie 中 我在这里读到
  • C# 4.0 编译器崩溃

    此代码示例 http pastie org 2757961无法编译 有什么解决办法吗 using System using System Collections Generic using System Linq using System
  • 如何对mysql数据库中的电子邮件进行加密但仍然能够查询它们?

    我想使用加密将用户的电子邮件地址存储在 MySQL 数据库中 以确保如果数据库遭到破坏 这些地址不会被公开 我相信如果我用 mysql 加密它们AES ENCRYPT https dev mysql com doc refman 5 1 e
  • 查看当前页面时预加载第二页

    假设我的网站有 5 页内容 当访问者查看第一页时 是否可以预加载接下来的两页 这样 当他们单击第二页或第三页的链接时 它就会立即出现 当然 你可以有一些像这样的隐形容器 HTML div a href page2 html Go secon
  • 使用 awk 解析 csv 并忽略字段内的逗号

    我有一个 csv 文件 其中每一行定义给定建筑物中的一个房间 除了房间之外 每行都有一个地板区域 我想要提取的是所有建筑物的所有楼层 我的文件看起来像这样 u floor u room name 0 00BDF AIRPORT TEST 0
  • Typedef 声明的形式为“int typedef my_int;”

    声明my int作为类型别名int我们可以写 typedef int my int 1 奇怪的是 以下似乎也定义了int alias int typedef my int 2 我以前从未见过这样的语法 为什么它有效 我读后的推理C 参考 h
  • 自定义类型文件到 Angular 6

    我正在尝试以角度方式广告一些自定义类型定义文件 但面临一些错误 在应用程序文件夹中 我有外部文件夹 其中有 external d ts 文件和下面的代码 declare function format input string args s
  • 如何包含目录中保存的所有CSS?

    html中是否可以同时包含多个css 或者更准确地说 是否可以一次性包含放置在一个目录中的所有 css 就像目前我们所做的是 我需要类似的东西 是否可以 或者有什么替代方案吗 您可以创建一个主样式表 将其包含在每个页面中 并在该 css 文
  • 在 Laravel 4 中重定向回时保留表单值

    我试图在 Laravel 4 上 Redirect back 时保留表单的值 但我找不到方法来做到这一点 这是我的表格 Form open array route gt generate files gt true Form radio m
  • 将 GWT-RPC-Applicaton 部署到 JBoss AS 7.1.1 时出现 ClassNotFoundException

    我有一个 Maven 基础 GWT 应用程序 当我通过 Maven 编译 构建并部署它到 JBoss AS 7 1 1 时 我的 GWT RPC Service 出现了 ClassNotFoundException 在我包含之前 我部署了并
  • INVALID_STATE_ERR:DOM 异常 11

    我正在开发一个简单的辅助类来使用 XmlHttpRequest 发送请求 代码如下 但我无法让它发挥作用 例如 在 google chrome 中 我收到错误INVALID STATE ERR DOM Exception 11在其他浏览器上
  • 子进程命令的实时输出

    我使用 python 脚本作为流体动力学代码的驱动程序 当需要运行模拟时 我使用subprocess Popen要运行代码 请收集输出stdout and stderr into a subprocess PIPE 然后我可以打印 并保存到