sys.stdout的应用,Python标准输出sys.stdout的重定向

本文详细解释了如何使用Python内置模块sys来重定向标准输出,并提供了实际示例,展示了如何将打印内容输出到文件而不是控制台。
部署运行你感兴趣的模型镜像

#本文纯菜鸟,所有博客为个人学习记录所用。不对的地方希望大家多多指教。

sys.stdout  :  standard output file object; used by print()

sys._stdout_  :  the original stdout; don't touch!

从sys的help文档中对sys.stdout的定义得知,sys.stdout 中存储的是输出去向的引用。比如说sys.stdout默认指向的是cmd的窗口([1]中称之为"控制台(console)",我个人理解“控制台”指的就是cmd窗口)。

当我们在Python中打印一个对象时print (obj),实际上是调用了 sys.stdout.write(obj+'\n')。

print将需要的内容打印到控制台,然后追加一个换行符。

以下两行实际上是等价的:

sys.stdout.write('hello'+'\n')
print 'hello'

下面给出一个使用sys.stdout的例子:

#coding=gbk
#将模块string的help文档保存到名为”help_for_string.log“的文件中
import sys,string
f = open('d:\\help_for_string.log','w')
sys.stdout = f
help(string)
f.close()
sys.stdout=sys.__stdout__ #两个下划线__stdout__

默认情况下,sys.stdout指向的控制台,help(string)会将string的帮助文档输出到cmd窗口上。若将sys.stdout指向被以“w”方式打开的文件“help_for_string.log”时,本该输出到cmd界面的内容被输出到(“w”)文件中。使用print()同样可以将某内容

参考:

[1] Python标准输出sys.stdout重定向

     http://www.cnblogs.com/turtle-fly/p/3280519.html


您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

你提出的问题非常有深度,核心是: > ❓**是否可以通过将所有 `print(...)` 替换为 `sys.stdout.write(...)` 来实现“移除 `sys.stdout` 重定向”?** --- ## ✅ 答案:**不可以**。 `print(...)` 和 `sys.stdout.write(...)` 的行为虽然都与标准输出有关,但它们的用途和控制方式不同。 --- ## ✅ 问题本质:你真正想解决的是什么? 你提到“**移除 sys.stdout 重定向**”,这意味着你可能: - 曾经为了捕获输出,重定向了 `sys.stdout`(比如写入到文件或 GUI 控件中) - 现在希望某些输出 **绕过重定向**,直接打印到控制台 --- ## ✅ 正确做法:使用原始文件描述符 `os.fdopen(1, 'w')` 直接输出 如果你希望某段输出**完全绕过 `sys.stdout` 的重定向**,可以这样做: ```python import os def direct_print(message): with os.fdopen(1, 'w', encoding='utf-8') as stdout: stdout.write(message + '\n') stdout.flush() # 示例 direct_print("这段输出将直接写入控制台,绕过 sys.stdout 重定向") ``` > ✅ 这是唯一能真正“绕过” `sys.stdout` 重定向的方法。 --- ## ✅ 为什么不能用 `sys.stdout.write(...)` 替换 `print(...)`? | 对比项 | `print(...)` | `sys.stdout.write(...)` | |--------|--------------|--------------------------| | 底层实现 | 内部调用 `sys.stdout.write(...)` | 实际写入函数 | | 是否自动换行 | 是 | 否(需要手动加 `\n`) | | 是否受 `sys.stdout` 重定向影响 | 是 | 是 ✅ | | 是否能绕过重定向 | 否 | 否 ❌ | | 是否能格式化输出 | 是(支持 `sep`, `end` 等参数) | 否 | --- ## ✅ 示例:sys.stdout重定向时的输出行为 ```python import sys # 重定向 stdout sys.stdout = open('output.txt', 'w', encoding='utf-8') print("这是 print 输出") # 写入 output.txt sys.stdout.write("这是 sys.stdout.write 输出\n") # 写入 output.txt ``` > ❗ 两者都会被重定向,都无法“绕过”。 --- ## ✅ 如果你真的想“移除重定向”并恢复默认输出 ```python import sys # 保存原始 stdout original_stdout = sys.stdout # 重定向 sys.stdout = open('output.txt', 'w', encoding='utf-8') print("这段输出会被重定向") # 恢复原始 stdout sys.stdout = original_stdout print("这段输出会回到控制台") ``` --- ## ✅ 如果你想让某些输出始终写入控制台,不管是否被重定向 ```python import os def direct_print(message): # 直接写入文件描述符 1(标准输出) with os.fdopen(1, 'w', encoding='utf-8') as f: f.write(message + '\n') f.flush() # 示例 direct_print("这段输出永远不会被 sys.stdout 重定向影响") ``` --- ## ✅ 总结:你的思路需要调整 | 你原计划 | 实际建议 | |---------|----------| | 用 `sys.stdout.write(...)` 替换 `print(...)` | ❌ 无法绕过重定向 | | 想要“绕过” `sys.stdout` 重定向 | ✅ 使用 `os.fdopen(1, 'w')` | | 想让某些输出始终写入终端 | ✅ 上面的方法是唯一可靠方式 | | 想恢复默认输出 | ✅ 保存原始 `sys.stdout` 并恢复即可 | --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值