0

0

Python 中实现 os.pipe() 的累计字节数统计

花韻仙語

花韻仙語

发布时间:2026-02-06 16:48:57

|

535人浏览过

|

来源于php中文网

原创

Python 中实现 os.pipe() 的累计字节数统计

linux 下使用 `os.pipe()` 时,由于管道文件描述符不支持随机寻址(`lseek`),无法直接调用 `tell()` 获取累计写入字节数;但可通过封装一个具备 `write()` 和 `flush()` 方法的类,将计数逻辑内置于写入过程,从而准确追踪总字节数。

os.pipe() 返回一对底层文件描述符(read_fd, write_fd),它们本质上是不可寻址的流式通道,因此任何依赖 lseek 的操作(如 fileobj.tell())都会抛出 IOError: [Errno 29] Illegal seek。标准库中没有内置的“带计数的管道包装器”,但 Python 的 I/O 协议非常灵活:只要对象实现了 write()(接受 bytes/str)和 flush() 方法,就可被多数 I/O 相关函数(如 print(..., file=...)、sys.stdout = ... 或 subprocess.Popen(stdout=...))接受。

以下是一个轻量、线程安全(可选加锁)、符合 Python I/O 协议的累计计数写入器示例:

import os
import threading

class CountingWriter:
    def __init__(self, fd, encoding='utf-8'):
        self.fd = fd
        self._count = 0
        self._lock = threading.Lock()
        self.encoding = encoding

    def write(self, data):
        if isinstance(data, str):
            data = data.encode(self.encoding)
        # 原子写入并累加
        with self._lock:
            n = os.write(self.fd, data)
            self._count += n
        return n

    def flush(self):
        # 管道无缓冲,flush 可为空,但需存在以满足协议
        pass

    @property
    def written_bytes(self):
        with self._lock:
            return self._count

# 使用示例
rfd, wfd = os.pipe()

# 将计数写入器绑定到写端
writer = CountingWriter(wfd)

# 模拟写入
writer.write(b"Hello")
writer.write(" 世界\n".encode('utf-8'))
writer.flush()

print(f"累计写入字节数: {writer.written_bytes}")  # 输出: 13("Hello" + " 世界\n" = 5 + 8)

# 注意:读端仍需用 os.read(rfd, ...) 手动读取
# os.close(rfd); os.close(wfd)  —— 实际使用中请记得关闭 fd

⚠️ 注意事项

Matlab语言的特点 中文WORD版
Matlab语言的特点 中文WORD版

本文档主要讲述的是Matlab语言的特点;Matlab具有用法简单、灵活、程式结构性强、延展性好等优点,已经逐渐成为科技计算、视图交互系统和程序中的首选语言工具。特别是它在线性代数、数理统计、自动控制、数字信号处理、动态系统仿真等方面表现突出,已经成为科研工作人员和工程技术人员进行科学研究和生产实践的有利武器。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载
  • CountingWriter 不提供 read() 或 close(),它仅代理写操作;管道生命周期仍需由调用方管理;
  • 若用于 sys.stdout = writer 场景,需确保所有输出均经此对象(例如 print("msg", file=writer)),且避免混用原生 os.write();
  • 多线程写入时务必加锁(如上例),否则 _count 可能出现竞态;
  • 对于 subprocess.Popen(stdout=writer),需注意子进程会继承该 fd,此时 writer 应仅作为“写入目标”而非主动读取方。

总结:虽然 os.pipe() 本身不提供字节计数能力,但借助 Python 的鸭子类型特性,自定义一个兼容 io.TextIOBase/io.BufferedIOBase 协议的写入器,即可在零侵入前提下精准统计累计写入量——这是兼顾简洁性与可扩展性的典型 Pythonic 解决方案。

立即学习Python免费学习笔记(深入)”;

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

190

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

4

2026.02.03

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

610

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

281

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

21

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

23

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

7

2026.02.06

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1478

2023.06.21

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

60

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.6万人学习

Git 教程
Git 教程

共21课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号