【Python系列】PYTHONUNBUFFERED=1的作用

news2025/5/13 3:09:09

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
    • 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

      • 作用详解
      • 典型使用场景
      • 设置方法
        • 1. 终端临时设置(Linux/macOS)
        • 2. Windows 命令行
        • 3. 永久生效(Docker)
        • 4. 替代方案
      • 注意事项
      • 示例对比
      • 总结

PYTHONUNBUFFERED=1 是一个 环境变量,用于控制 Python 程序的输出缓冲行为。它的核心作用是 禁用标准输出(stdout)和标准错误(stderr)的缓冲机制,使得输出内容能够实时显示,而非等待缓冲区填满后才一次性写入。以下是它的具体作用和场景说明:
在这里插入图片描述


作用详解

  1. 禁用输出缓冲

    • 默认情况下,Python 会将输出内容(如 print() 语句)暂存在内存缓冲区中,直到缓冲区填满或程序结束才一次性写入终端/日志文件。
    • 设置 PYTHONUNBUFFERED=1 后,所有输出会 立即写入,不再等待缓冲区。
  2. 实时显示日志

    • 对于需要实时查看输出的场景(如调试、监控、日志流),禁用缓冲可以避免日志延迟,确保信息即时可见。
  3. 崩溃时保留日志

    • 如果程序意外崩溃,未写入缓冲区的日志会丢失。禁用缓冲能确保崩溃前的输出被完整记录。

典型使用场景

  1. 容器化环境(如 Docker/Kubernetes)

    • 在容器中运行 Python 程序时,日志默认通过 stdout 收集。禁用缓冲可让容器日志工具(如 Docker Logs、Fluentd)实时捕获输出。
    • Dockerfile 示例
      ENV PYTHONUNBUFFERED=1
      
  2. 调试和开发

    • 调试长时间运行的程序(如循环、服务)时,实时输出能帮助快速定位问题。
  3. CI/CD 流水线

    • 在自动化构建和测试中,即时输出有助于快速发现错误,避免等待日志刷新。

设置方法

1. 终端临时设置(Linux/macOS)
PYTHONUNBUFFERED=1 python your_script.py
2. Windows 命令行
set PYTHONUNBUFFERED=1 && python your_script.py
3. 永久生效(Docker)

在 Dockerfile 中声明环境变量:

ENV PYTHONUNBUFFERED=1
4. 替代方案
  • 使用 -u 参数(效果相同):
    python -u your_script.py
    
  • 在代码中强制刷新(局部控制):
    print("Debug info", flush=True)  # 单次刷新
    import sys
    sys.stdout.flush()               # 手动刷新缓冲区
    

注意事项

  • 性能影响
    禁用缓冲会增加 I/O 操作频率,对高频输出(如每秒数千次 print())可能降低性能。仅在需要实时日志时启用
  • 默认缓冲策略
    Python 的缓冲行为取决于输出目标:
    • 输出到终端(TTY)时,默认行缓冲(逐行刷新)。
    • 输出到文件或管道时,默认全缓冲(缓冲区满后刷新)。

示例对比

  • 未禁用缓冲(日志可能延迟显示):

    import time
    for i in range(5):
        print(f"Step {i}")
        time.sleep(1)
    

    输出可能一次性显示在循环结束后。

  • 禁用缓冲(日志实时显示):

    PYTHONUNBUFFERED=1 python script.py
    

    每秒钟输出一行 Step 0, Step 1… 实时可见。


总结

  • 何时用:需要实时日志、调试崩溃问题、容器化部署。
  • 何时不用:对性能敏感的高频输出场景(如数据处理流水线)。
  • 核心价值:确保关键日志的即时性和完整性。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2306540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux中的cgdb的基本使用

1.cgdb的简介 Linux中的cgdb是一个基于GDB(GNU Debugger)的图形化调试前端,它结合了GDB的命令行界面功能和代码查看窗口,为开发者提供了一个更为直观的调试体验。 cgdb的作用和功能: 直观调试体验:cgdb提供…

解决idea2019创建springboot项目爆红的问题

通过spring Initializr创建springboot项目时,由于idea版本太低,创建完成后需要手动修改pom.xml,对小白不太友好 一个简便的方法,配置好pom.xml文件的各个版本: 在 https://start.aliyun.com/ 上选择好后复制pom.xml代…

DeepSeek 提示词:基础结构

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car,需要转换到相机坐标系下,旋转矩阵R_car2Cam,平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1:先旋转再平移 p_cam T_car2Cam * p_car T_car2Cam 需要注…

[实现Rpc] 客户端 | Requestor | RpcCaller的设计实现

目录 Requestor类的实现 框架 完善 onResponse处理回复 完整代码 RpcCaller类的实现 1. 同步调用 call 2. 异步调用 call 3. 回调调用 call Requestor类的实现 (1)主要功能: 客户端发送请求的功能,进行请求描述对服务器…

smolagents学习笔记系列(五)Tools-in-depth-guide

这篇文章锁定官网教程中的 Tools-in-depth-guide 章节,主要介绍了如何详细构造自己的Tools,在之前的博文 smolagents学习笔记系列(二)Agents - Guided tour 中我初步介绍了下如何将一个函数或一个类声明成 smolagents 的工具&…

axios几种请求类型的格式

Axios 是一个基于 Promise 的 HTTP 客户端,广泛用于浏览器和 Node.js 中发送 HTTP 请求。它支持多种请求格式,包括 GET、POST、PUT、DELETE 等。也叫RESTful 目录 一、axios几种请求类型的格式 1、get请求 2、post请求 3、put请求 4、delete请求 二…

架构设计系列(六):缓存

一、概述 在应用对外提供服务的时候其稳定性,性能会受到诸多因素的影响。缓存的作用是将频繁访问的数据缓存起来,避免资源重复消耗,提升系统服务的吞吐量。 二、缓存的应用场景 2.1 客户端 HTTP响应可以被浏览器缓存。我们第一次通过HTTP请…

个人电脑小参数GPT预训练、SFT、RLHF、蒸馏、CoT、Lora过程实践——MiniMind图文版教程

最近看到Github上开源了一个小模型的repo,是真正拉低LLM的学习门槛,让每个人都能从理解每一行代码, 从零开始亲手训练一个极小的语言模型。开源地址: GitHub - jingyaogong/minimind: 🚀🚀 「大模型」2小时…

格式工厂 FormatFactory v5.18.便携版 ——多功能媒体文件转换工具

格式工厂 FormatFactory v5.18.便携版 ——多功能媒体文件转换工具 功能:视频 音频 图片 文档PDF格式 各种转换,同格式调整压缩比例,调整大小 特色:果风图标 好看; 支持多任务队列,完成自动关机 下载地址&#xff1…

KafkaTool

Offset Explorer 第一次打开需要配置kafka相关配置连接 随便先启动一个Kafka(先启动zookeeper) 设置key value 记得刷新

基于C++“简单且有效”的“数据库连接池”

前言 数据库连接池在开发中应该是很常用的一个组件,他可以很好的节省连接数据库的时间开销;本文基使用C实现了一个简单的数据库连接池,代码量只有400行只有,但是压力测试效果很好;欢迎收藏 关注,本人将会…

国产编辑器EverEdit - 洞察秋毫!文件比较功能!

1 文件比较 1.1 应用场景 项目开发过程中,可能不同的部分会由不同的人在负责,存在一个文件多人编辑的情况,用户需要寻找差异,并将文档进行合并,比较专业的文本比较工具为BeyondCompare,WinMerge等。   如…

QARepVGG--含demo实现

文章目录 前言引入Demo实现总结 前言 在上一篇博文RepVGG中,介绍了RepVGG网络。RepVGG 作为一种高效的重参数化网络,通过训练时的多分支结构(3x3卷积、1x1卷积、恒等映射)和推理时的单分支合并,在精度与速度间取得了优…

kotlin 知识点 七 泛型的高级特性

对泛型进行实化 泛型实化这个功能对于绝大多数Java 程序员来讲是非常陌生的,因为Java 中完全没有这个概 念。而如果我们想要深刻地理解泛型实化,就要先解释一下Java 的泛型擦除机制才行。 在JDK 1.5之前,Java 是没有泛型功能的,…

Transformer LLaMA

一、Transformer Transformer:一种基于自注意力机制的神经网络结构,通过并行计算和多层特征抽取,有效解决了长序列依赖问题,实现了在自然语言处理等领域的突破。 Transformer 架构摆脱了RNNs,完全依靠 Attention的优…

Qt学习 网络编程 TPC通信

一 基本网络端口 1 网络编程基本概念 通讯方式:信息的通讯时通过网络来进行,通讯方式有两种,TCP和UDP通信,TCP通讯是专用通道,指定某个信息只能走某个通道,UDP则是非专用通道,比如一个车队&am…

ESP32-S3 实战指南:BOOT-KEY 按键驱动开发全解析

一、基础知识 本篇我们使用 BOOT 按键来学习一下 GPIO 功能,首先补充一下相关术语介绍。 1、GPIO(General Purpose Input/Output) GPIO 是微控制器上的通用引脚,既可以作为输入(读取外部信号)&#xff0…

ssh配置 远程控制 远程协作 github本地配置

0.设备版本 windows11 ubuntu24.0.4 1.1 在 Linux 上启用 SSH 服务 首先,确保 Linux 计算机上安装并启用了 SSH 服务。 安装和启动 OpenSSH 服务(如果未安装) # 在终端安装 OpenSSH 服务(如果尚未安装) sudo apt …

C++知识整理day9——继承(基类与派生类之间的转换、派生类的默认成员函数、多继承问题)

文章目录 1.继承的概念和定义2.基类与派生类之间的转换3.继承中的作用域4.派生类的默认成员函数5.实现一个不能被继承的类6.继承与友元7.继承与静态成员8.多继承和菱形继承问题8.1 继承分类及菱形继承8.2 虚继承 1.继承的概念和定义 概念: 继承(inheritance)机制是⾯…