分别记录 stdout 和 stderr 时截断的输出日志文件

2024-06-30

我在上下文管理器中设置了一个子进程命令,该命令通过我自己的记录器将 stdout 和 stderr 通过管道传输到单独的文件。这是此处给出的答案的变体:https://stackoverflow.com/a/4838875/4844311 https://stackoverflow.com/a/4838875/4844311

我的代码如下:

import logging
import subprocess

with StreamLogger(logging.DEBUG, my_out_logger) as out:
    with StreamLogger(logging.ERROR, my_err_logger) as err:
        p = subprocess.Popen(cmd, shell=False, stdout=out, stderr=err)
        p.communicate()
        p.wait()

where my_out_logger and my_err_logger是带有记录到文件等的句柄的记录对象。

StreamLogger 代码与上面链接中给出的代码类似:

import io
import os
import threading
import select
import time

class StreamLogger(io.IOBase):
    def __init__(self, level, logger):
        self.logger = logger
        self.level = level
        self.pipe = os.pipe()
        self.thread = threading.Thread(target=self._flusher)
        self.thread.start()

    def _flusher(self):
        self._run = True
        buf = b''
        while self._run:
            for fh in select.select([self.pipe[0]], [], [], 0)[0]:
                buf += os.read(fh, 1024)
                while b'\n' in buf:
                    data, buf = buf.split(b'\n', 1)
                    self.write(data.decode())
            time.sleep(0.01)
        self._run = None

    def write(self, data):
        return self.logger.log(self.level, data)

    def fileno(self):
        return self.pipe[1]

    def close(self):
        if self._run:
            self._run = False
            while self._run is not None:
                time.sleep(0.01)
            os.close(self.pipe[0])
            os.close(self.pipe[1])

我的代码与上面链接中的答案提供的代码之间的唯一显着区别是,我的代码将日志记录消息发送到根据其句柄进行重定向的记录器,而不是直接记录,如链接中的代码所示。

这段代码大部分时间都工作正常。

但我注意到,每隔一段时间就会有一个被截断的输出日志文件。看起来输出文件是由FileHandler in my_out_logger在写入所有标准输出内容之前正在关闭。

我不确定为什么会发生这种情况或在哪里修复代码。现在我刚刚添加了一个time.sleep(0.3)之间的声明p.communicate() and p.wait()这减少了截断文件的频率,但这似乎是一个丑陋的解决方案。

我宁愿了解出了什么问题并正确修复它。我欢迎任何建议或见解。


我想我终于想通了。 这里的问题是StreamLogger代码无法显式检查以确保stdout已全部写完。一旦主线程运行subprocess收到一个returncode,它退出上下文管理器,调用__exit__()的方法StreamLogger,继承自IOBase(源代码here https://pythonhosted.org/experimentdb/_modules/io.html)。这调用close()这改变了self._run归因于False。这会导致轮询管道的线程停止循环,无论管道中仍有什么内容。

这对于大多数具有小到中等输出的命令来说效果很好stdout,其中之间没有滞后时间returncode返回并写入输出。但就我而言,我正在运行一个程序subprocess大量文本写入stdout。因此,在主线程告诉子线程停止轮询管道之前,存在一种与时间的竞赛,尝试清除管道。

这里的两个关键变量是从管道读取的缓冲区的大小以及轮询管道的频率。我通过增加缓冲区大小解决了我的问题os.read()到 4096,并且还删除了time.sleep() in the while循环中_flusher()方法。这最大化了可以从管道读取的数据量,并且在我的例子中确保在日志记录循环停止之前完全记录输出。

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

分别记录 stdout 和 stderr 时截断的输出日志文件 的相关文章

  • Python:UnboundLocalError:赋值前引用的局部变量“count”[重复]

    这个问题在这里已经有答案了 我不明白我的 Python 代码有什么问题 它给了我以下错误 Traceback most recent call last File main py line 77 in
  • f2py:公开“已使用”模块的参数

    我认为这个问题已经在某个地方得到解决 但我花了大量的时间四处寻找答案 包括深入研究源代码 我试图将问题放在第一段中 其余部分显示了问题的基本示例 我正在尝试编译一个包含USE指向另一个更通用的模块的语句 我更愿意将使用的模块分开 以便它可以
  • 使用脚本取消设置 PDF 字体

    我正在使用 xhtml2pdf 库自动创建 PDF 几个月前我有过这个问题 https stackoverflow com questions 25203219 xhtml2pdf doesnt embed helvetica 库嵌入了我没
  • 为什么我不能将 addstr() 添加到 pythoncurses 窗口中的最后一行/列?

    使用Python 我尝试使用addstr 将光标位置写入curses 窗口的右下角 但出现错误 ScreenH 2工作正常 但打印在窗口底部的第二行 ScreenH 1根本不起作用 我究竟做错了什么 import curses Screen
  • 如何在 Python 中执行等效的 Excel INDEX MATCH

    我有一个问题 关于如何执行相当于使用 Excel 中的 INDEX MATCH 函数返回值并在 Python 中应用它的操作 作为一名对大型数据集执行数据分析和操作的 Excel 用户 为了提高效率 我已转向 Python 我试图做的是根据
  • 使用多处理或线程加速单个任务

    是否可以使用多处理 线程来加速单个任务 我的直觉是答案是否定的 以下是我所说的 单一任务 的示例 for i in range max pick random choice on off both 当参数为 10000000 时 在我的系统
  • 从 pexpect 中提取 stderr

    我的问题很简单 我可以吗 expect 使用 pexpect 查看 stderr 上的某些输出 它似乎pexpect spawn 只能用于期望 stdout 上的输出 乌托邦的例子 import pexpect child pexpect
  • 在 Python 中获取连接的 VPN 名称

    我正在尝试检索已连接的 VPN 的名称 我运行的是 Fedora 23 因此连接在 etc NetworkManager system connections 中得到了很好的枚举 其中一个文件列出了 VPN 配置的每个参数 包括我要查找的
  • Pytorch不支持one-hot向量?

    我对 Pytorch 如何处理 one hot 向量感到非常困惑 在这个tutorial https pytorch org tutorials beginner blitz cifar10 tutorial html 神经网络将生成一个
  • 如何交换两个 DataFrame 列?

    In MATLAB to swap the first and second columns of a table A one would do this1 A A 2 1 3 end 如果有类似的方便方法可以做到这一点A是一只熊猫Data
  • 从图像中读取文本

    关于将这些图像转换为文本有什么建议吗 我正在使用 pytesseract 除了这个之外 它在大多数情况下都工作得很好 理想情况下 我会准确地读取这些数字 最坏的情况我可以尝试使用 PIL 来确定 左边的数字是否为零 从左边开始 找到第一个白
  • Python/Excel - IOError: [Errno 2] 没有这样的文件或目录:

    尝试从文件中提取 xlsx 文档并将数据编译到单个工作表中 尽管文件存在但仍收到 IOError 程序如下 loop that pulls in files from folder import os create directory fr
  • ModuleNotFoundError:没有名为“discord_slash”的模块[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 I m trying to install a module called discord slash https py
  • 使派生类的方法异步

    我必须创建并使用从上游包派生的类 不可修改 我想要 需要在派生类中添加 修改一个应该是异步的方法 因为我需要在该方法中等待 websocket send recv 我尝试将异步添加到该方法 但我收到消息 从基类方法 我的方法来自派生类Run
  • 使用python docx合并word文档

    我有几个单词文件 每个文件都有特定的内容 我想要一个片段来展示或帮助我弄清楚如何在使用 Python 时将单词文件合并到一个文件中docx图书馆 例如 在 pywin32 库中我执行了以下操作 rng self doc Range 0 0
  • Python:控制超时长度

    我在脚本中运行了类似于以下的代码 try s ftplib FTP xxx xxx xxx xxx username password except print Could not contact FTP serer sys exit 如果
  • 多处理和美好价值

    有谁知道在多处理中创建进程或池时设置进程或池的良好值的简单方法 os nice increment Add increment to the process s niceness Return the new niceness Availa
  • 在heroku上安装pdftotext库

    pdftotext 库是requirements txt 中的要求 在尝试推送到 heroku 时 出现以下错误 remote Running setup py install for pdftotext started remote Ru
  • 模拟 default=timezone.now 进行单元测试

    我正在尝试为执行大量日期时间操作的 django 应用程序编写单元测试 我已经安装了mock http www voidspace org uk python mock 给 django 打猴子补丁timezone now为了我的测试 虽然
  • 为什么“导入*”不好?

    建议不要使用import 在Python中 谁能分享一下原因 以便我下次可以避免这样做 因为它将很多东西放入您的名称空间中 可能会隐藏以前导入的其他对象 而您不会知道它 因为您不确切知道导入了什么 并且无法轻松找到某个东西是从哪个模块导入的

随机推荐

  • 具有计数的资源的 Terraform 输出

    我的 s3 资源位于 terraform 中 配置如下 locals bucket count length var s3 config bucket names resource aws s3 bucket s3 bucket count
  • VueJS $watch $refs

    是否有可能 watch Vue refs 我想针对嵌套在当前 Vue 实例内但在ready打回来 refs childcomponent最初是undefined当它被处理时 inside ready this watch refs func
  • 使用线段树求矩形并集的面积

    我试图了解可用于计算一组轴对齐矩形的并集面积的算法 我遵循的解决方案在这里 http tryalgo org en geometry 2016 06 25 union of rectangles http tryalgo org en ge
  • WooCommerce 从所有订单中获取项目元

    我正在尝试显示 WooCommerce 插件中所有已完成订单的所有订单项目 带有项目元 我还想将显示限制为仅显示 10 个订单项目 我已经弄清楚如何显示所有订单项目 但无法将数量限制为 10 这是我当前用于显示所有订单项目的代码 args
  • 如何在 JavaScript 中编写回文

    我想知道如何在javascript中编写回文 我在其中输入不同的单词 程序显示单词是否是回文 例如 单词 noon 是回文 而 bad 则不是 先感谢您 function palindrome str var len str length
  • 创建一个每 n 轮激活的 Keras 回调

    我想在 Keras 中创建自己的回调 但不太明白如何去做 我想做的是创建一个回调n e g n 10 epochs 调用一个函数 根据 Keras 文档 https keras io callbacks https keras io cal
  • “引用透明”IO 调用的可重入缓存

    假设我们有一个 IO 操作 例如 lookupStuff InputType gt IO OutputType 这可能是一些简单的事情 例如 DNS 查找 或者针对时不变数据的某些 Web 服务调用 我们假设 该操作永远不会抛出任何异常和
  • Linux/UNIX 中 COM 编程的模拟

    组件对象模型 COM 是 或者曾经是 Windows 中提供语言中立的软件组件的方式 Linux UNIX 中是否有任何编程模型具有与通过二进制组件重用代码相同的理念 Sun RPC http en wikipedia org wiki R
  • whereHas 之后的 where 查询在 Laravel 5.4 中无法正常工作

    就我而言 我有channels与多对多关系的表类别 table 我想获取他们的频道类别包含像doing这样的动态值LIKE查询每个类别的标题 但我需要检查 a 的另一列channel通过 where 子句 这是一个channel结构 id
  • 为什么使用 jQuery 预加载图像的尝试不起作用?

    目前我有这个代码 var imgCount 36 var container 3D spin var loaded 0 function onLoad alert loaded loaded if loaded gt imgCount al
  • 开玩笑单元测试是否调用了 super()

    我有一个自定义错误类 它扩展了 Javascript 中的内置错误类 我提出的问题是 通过我的 Jest 单元测试 不会检查 super 方法是否被调用 export class AppError extends Error public
  • TextBlock 中的 C# 超链接:单击它时没有任何反应

    在我的 C 独立应用程序中 我想让用户单击一个链接来启动他们最喜欢的浏览器 System Windows Controls TextBlock text new TextBlock Run run new Run Link Text Hyp
  • 如何使 XMLUNIT 的 WithNodeFilter 动态 C#

    我正在开发一个比较 XML 文件的应用程序 用户可以输入他们想要在比较中排除的节点列表 为了进行比较 我正在使用XMLUNIT https www xmlunit org 我需要动态添加用户输入 下面的代码可以工作 但对于用户输入来说不是动
  • 如何在 C# 中创建唯一的随机字符序列?

    我正在我的应用程序中实现 URL 缩短功能 以便为我的用户提供可在 Twitter 中使用的更短的替代 URL 关键是要独立于提供相同服务的缩短服务 并将其作为我的网络应用程序的一项功能 创建约 6 个字符的独特随机字符序列的最佳方法是什么
  • JVM中为什么要交换对象位置? [复制]

    这个问题在这里已经有答案了 这是我尝试过的 public final class firstObj public static void main String args Object obj new Object Object obj1
  • 正确检测 Android 中 ViewPager 内放置的 GridView 上的滑动

    我有一个 ViewPager 它使用 GridViews 作为页面 我希望 ViewPager 在我滑动屏幕时切换页面 问题在于 当在 GridView 上进行滑动时 不会检测到滑动 在 GridView 之外 滑动可以正常工作 看来 Gr
  • NSManagedObject 托管对象之外的子类作为普通对象

    我有一个实体对象 Country 其中包含国家 地区名称和国家 地区代码 它是 NSManagedObject 的子类 我将它与核心数据模型一起使用 将其值存储到持久存储中 我有一个地方 相同的国家 地区对象将用作普通对象 即我将使用它来存
  • javascript,正则表达式解析大括号中的字符串内容

    我是正则表达式的新手 我正在尝试解析字符串中大括号内的所有内容 我抬头这个帖子 https stackoverflow com questions 413071 regex to get string between curly brace
  • WP7 文字环绕图像

    我的图像在文本块控件的右侧有大量文本 如何让该文本在图像的右侧和下方换行 标准的 TextBlock 和 Image 控件不适合您 我想你会 必须在 Web 浏览器中使用 HTML 这可能非常慢且难看 必须使用多个 TextBlock 并且
  • 分别记录 stdout 和 stderr 时截断的输出日志文件

    我在上下文管理器中设置了一个子进程命令 该命令通过我自己的记录器将 stdout 和 stderr 通过管道传输到单独的文件 这是此处给出的答案的变体 https stackoverflow com a 4838875 4844311 ht