📜  如何在 python 中获取终端输出(1)

📅  最后修改于: 2023-12-03 15:24:20.194000             🧑  作者: Mango

如何在 Python 中获取终端输出

在 Python 中,获取终端输出有很多种方式,本文将介绍其中的几种常见方式。

1. 使用 sys 模块获取终端输出

可以使用 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!
2. 使用 subprocess 模块获取终端输出

还可以使用 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)