print输出重定向介绍

文章讲述了如何在Python中将`print`函数的输出重定向到文本文件中,通过将`sys.stdout`替换为文件对象实现。同时,介绍了使用`with`语句和`contextlib.redirect_stdout`上下文管理器进行临时重定向的方法,以及自定义类似功能的上下文管理器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们需要明确一点:

print()在打印时,实际上是调用了sys.stdout.write()

只不过print在把内容打印到控制台后,追加了一个换行符(linefeed)。

所以以下两种写法是一样的:

print("HELLO WORLD")
sys.stdout.write("HELLO WORLD\n")

所以当我们需要将输出重定向到文本中,该如何操作呢?

首先我们看一下普通文本对象和标准输出对象的区别:

1. 标准输出对象

print(type(sys.stdout)) # <class '_io.TextIOWrapper'>
print(dir(sys.stdout))

# 输出见下
'''
['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fil
### 实现串口打印输出重定向 #### 1. 准备工作 为了能够将 `printf` 输出重定向至串口,在程序中需引入必要的头文件并配置好相应的外设。对于 STM32 设备而言,通常会涉及到标准输入输出库 `<stdio.h>` 和硬件抽象层 (HAL) 库。 ```c #include "stm32f1xx_hal.h" #include <stdio.h> ``` #### 2. 初始化 UART 外设 确保已正确初始化用于通信的 UART 接口,比如这里以 USART1 为例: ```c UART_HandleTypeDef huart1; void MX_USART1_UART_Init(void){ huart1.Instance = USART1; huart1.Init.BaudRate = 9600; // 设置波特率为9600bps huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart1); } ``` #### 3. 定义 `_write` 函数 为了让 C 标准库中的 `printf` 能够识别新的输出路径,需要覆盖掉默认的标准输出流处理逻辑。这可以通过自定义 `_write` 函数来完成,该函数负责接收来自 `printf` 的字符并将它们发送给指定的 UART 端口[^3]。 ```c int _write(int file, char *ptr, int len){ HAL_UART_Transmit(&huart1, (uint8_t *) ptr, len, HAL_MAX_DELAY); return len; } ``` 上述代码片段实现了当调用 `printf` 或其他基于标准 I/O 流的操作时,实际的数据会被传递给此 `_write` 函数执行,并最终通过 UART 发送出去。 #### 4. 使用 `printf` 进行测试 一旦完成了以上步骤,则可以直接使用 `printf` 来向连接着计算机或其他设备的串口发送消息了。例如可以编写如下简单的测试语句验证效果: ```c int main(){ /* Initialize all configured peripherals */ MX_USART1_UART_Init(); printf("Hello World!\r\n"); while(1){} } ``` 此时,“Hello World!” 就应该能够在与 MCU 相连的 PC 上打开的串口监视器里看到被成功接收到的信息了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值