捕获输出
读取 stdout 和 stderr
捕获输出 是 CoddyKit 上的免费 Python Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
捕获 stdout
要读取命令打印的内容,请传入 capture_output=True。文本会出现在结果的 stdout 属性中。
import subprocess
cp = subprocess.run(['echo', 'hello'], capture_output=True)
print(cp.stdout)字节与文本
默认情况下,输出是字节。传入 text=True 可以改为获取解码后的字符串,这通常更符合需要。
import subprocess
cp = subprocess.run(['echo', 'hello'], capture_output=True, text=True)
print(repr(cp.stdout))去除末尾换行符
命令输出通常以换行符结尾。在使用该值前,请使用 .strip() 清理它。
import subprocess
cp = subprocess.run(['echo', 'value'], capture_output=True, text=True)
clean = cp.stdout.strip()
print('[' + clean + ']')捕获 stderr
错误通常会输出到 stderr,并单独捕获。这样可以将正常输出与错误消息区分开。
import subprocess
cp = subprocess.run(['ls', '/no/such/dir'], capture_output=True, text=True)
print('stdout:', repr(cp.stdout))
print('stderr:', cp.stderr.strip())在代码中使用输出
捕获的输出就是一个字符串,因此您可以对其进行解析:拆分行、转换数字,或将其传递给程序的其他部分。
import subprocess
cp = subprocess.run(['printf', 'a\nb\nc\n'], capture_output=True, text=True)
lines = cp.stdout.splitlines()
print('line count:', len(lines))
print(lines)将 stderr 重定向到 stdout
要将错误输出合并到正常输出流中,请设置 stderr=subprocess.STDOUT。这样两者都会出现在 stdout 中。
import subprocess
cp = subprocess.run(['ls', '/no/such/dir'], stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, text=True)
print(cp.stdout.strip())提供输入
使用 input 参数将数据传递给命令的标准输入。这里会将文本通过管道传递给 cat。
import subprocess
cp = subprocess.run(['cat'], input='piped in\n', capture_output=True, text=True)
print(cp.stdout.strip())check_output 快捷方式
subprocess.check_output() 会运行命令并直接返回其 stdout,失败时会引发异常。它是捕获输出的便捷单行写法。
import subprocess
out = subprocess.check_output(['echo', 'quick'], text=True)
print(out.strip())丢弃输出
要让命令静默运行,请将其输出流重定向到 subprocess.DEVNULL。
import subprocess
cp = subprocess.run(['echo', 'silent'], stdout=subprocess.DEVNULL)
print('return code only:', cp.returncode)处理带有输出的错误
使用 check=True 时,引发的 CalledProcessError 仍会携带捕获的 output 和 stderr,便于诊断。
import subprocess
try:
subprocess.run(['ls', '/missing'], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:
print('failed:', e.returncode)
print('stderr:', e.stderr.strip())整合起来
一个典型的辅助函数会运行命令、检查是否成功,然后返回干净的文本。这段内容封装了常见模式。
import subprocess
def capture(cmd):
cp = subprocess.run(cmd, capture_output=True, text=True, check=True)
return cp.stdout.strip()
print(capture(['echo', 'final result']))快速检查
请测试您对捕获输出的理解。
总结
您已学会捕获输出:
capture_output=True加上text=True可以得到字符串形式的stdout和stderr。- 使用
stderr=subprocess.STDOUT合并输出流;使用DEVNULL静默输出。 - 通过
input=传入输入;check_output是一种快捷方式。 - 错误对象会携带捕获的输出,便于调试。
下一步:读取环境变量并了解 os 模块。
常见问题解答
「捕获输出」课时是免费的吗?
是的 — 「捕获输出」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「捕获输出」这节课中我会学到什么?
读取 stdout 和 stderr 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「捕获输出」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。