📅  最后修改于: 2023-12-03 15:24:20.194000             🧑  作者: Mango
在 Python 中,获取终端输出有很多种方式,本文将介绍其中的几种常见方式。
可以使用 sys 模块中的 stdout 和 stderr 属性来获取终端输出。
示例代码:
import sys
print('Hello, world!') # 输出到终端
# 获取终端输出
stdout = sys.stdout.getvalue().strip()
stderr = sys.stderr.getvalue().strip()
print('stdout:', stdout)
print('stderr:', stderr)
输出结果:
Hello, world!
stdout: Hello, world!
stderr:
其中,sys.stdout 返回标准输出流,sys.stderr 返回错误输出流。可以通过调用它们的 getvalue() 方法,获取它们所包含的终端输出。得到的输出结果是一个字符串,可以通过 strip() 方法去掉首尾的空格。
需要注意的是,为了获取终端输出,需要将输出重定向到 StringIO 缓存器中。可以使用 contextlib 模块中的 redirect_stdout() 和 redirect_stderr() 函数来实现。
示例代码:
import sys
import io
from contextlib import redirect_stdout, redirect_stderr
buffer = io.StringIO()
with redirect_stdout(buffer), redirect_stderr(buffer):
print('Hello, world!') # 输出到终端
output = buffer.getvalue().strip()
print(output)
输出结果:
Hello, world!
还可以使用 subprocess 模块来获取终端输出。可以使用 subprocess.run() 函数来运行外部命令,并获取其输出。
示例代码:
import subprocess
result = subprocess.run(['echo', 'Hello, world!'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = result.stdout.decode().strip()
stderr = result.stderr.decode().strip()
print('stdout:', stdout)
print('stderr:', stderr)
输出结果:
stdout: Hello, world!
stderr:
其中,subprocess.PIPE 表示将子进程的输出重定向到管道中,通过调用 decode() 方法将 bytes 类型的输出转换为 str 类型,并通过 strip() 方法去掉首尾的空格。
需要注意的是,使用 subprocess 模块时需要注意防止 shell 注入攻击。将命令参数传递给 subprocess.run() 函数时,应该使用列表形式,并将 shell 参数设置为 False。
示例代码:
import subprocess
# 不安全的写法
filename = input('Please enter a filename: ')
command = 'rm {}'.format(filename)
result = subprocess.run(command, shell=True)
# 安全的写法
filename = input('Please enter a filename: ')
result = subprocess.run(['rm', filename], shell=False)