python subprocess获取stdout和stderr

本文介绍了使用Python的subprocess模块来获取子进程的实时标准输出和错误输出的方法。通过将stderr重定向到stdout,结合while循环和poll()函数,可以实现在父进程中实时接收子进程的输出。

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

本文转载自http://www.firefoxbug.com/index.php/archives/2419/,如有版权问题请联系博主删除

用subprocess的时候,怎么获取stdout和stderr?下面是一种方式

import subprocess
p = subprocess.Popen(['tail','-10','/tmp/hosts.txt'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)

stdout,stderr = p.communicate()
print 'stdout : ',stdout
print 'stderr : ',stder

popen调用的时候会在父进程和子进程建立管道,然后我们可以把子进程的标准输出和错误输出都重定向到管道,然后从父进程取出。上面的communicate会一直阻塞,直到子进程跑完。这种方式是不能及时获取子程序的stdout和stderr。
还有一种方案,就是可以获取实时的输出信息

p = subprocess.Popen("/etc/service/tops-cmos/module/hadoop/test.sh", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
returncode = p.poll()
while returncode is None:
        line = p.stdout.readline()
        returncode = p.poll()
        line = line.strip()
        print line
print returncode

这里就是把错误输出重定向到PIPE对应的标准输出,也就是说现在stderr都stdout是一起的了,下面是一个while,poll回去不断查看子进程是否已经被终止,如果程序没有终止,就一直返回None,但是子进程终止了就返货状态码,甚至于调用多次poll都会返回状态码。上面的demo就是可以获取子进程的标准输出和标准错误输出。

### Python 中 `stdout` 的定义作用 在 Python 中,`stdout` 是标准库模块 `sys` 提供的一个对象,代表 **标准输出流**。它是程序默认用于输出数据的通道,通常指向用户的终端或控制台窗口[^1]。 #### 定义 `sys.stdout` 是一个类文件对象(file-like object),具有诸如 `.write()` `.flush()` 方法。它的主要功能是接收并发送程序产生的输出到指定的目标位置。默认情况下,这个目标通常是操作系统的终端界面,但在某些场景下也可以被重定向至其他地方,比如文件或其他可写入的对象[^2]。 #### 作用 以下是 `stdout` 的几个重要作用: 1. **默认输出目的地** 当调用内置函数 `print()` 时,默认会将字符串传递给 `sys.stdout.write()` 来完成实际的数据输出过程[^1]。 2. **灵活的重定向能力** 开发者可以通过重新赋值 `sys.stdout` 或利用 `print()` 函数中的 `file` 参数来改变输出流向。例如,在 Python 3.x 版本中,可以直接通过如下方式实现局部重定向: ```python with open('output.txt', 'w') as f: print("This will be written to output.txt", file=f) ``` 3. **跨平台兼容性** 尽管不同操作系统可能有不同的底层机制处理输入/输出,但 Python 抽象化了这些差异,使得开发者无需关心具体细节就能正常使用 `stdout` 进行交互[^2]。 4. **编码管理** 对于文本型数据来说,`sys.stdout.encoding` 属性指定了当前连接的标准输出设备所使用的字符集编码规则。如果该属性返回 None 值,则表明无法确定合适的编码方案;此时建议手动设定统一的编码格式以避免潜在问题发生[^2]。 ```python import sys if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding is not None: encoding = sys.stdout.encoding else: encoding = 'utf-8' ``` 以上代码片段展示了如何安全获取有效的编码名称以便后续使用。 --- ### 实际应用案例分析 假设我们需要记录日志信息而不想干扰正常运行期间显示的消息内容,那么就可以创建一个新的文件作为临时存储容器并将原生 `stdout` 替换掉: ```python original_stdout = sys.stdout # Backup original stdout with open('log_file.log', 'w') as log_file: sys.stdout = log_file # Redirect stdout to our new target print("Logging information...") # This goes into log_file instead of console sys.stdout = original_stdout # Restore previous state after done logging print("Back to normal operation.") ``` 此方法允许我们在不影响原有逻辑结构的前提下增加额外的功能特性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值