Python subprocess模块的介绍与使用
subprocess
模块是Python标准库中的一个模块,主要用于生成子进程以执行外部命令和与其进行交互。它是对旧有的os.system
、os.spawn
等方式的更强大和灵活的替代方案。
主要功能
subprocess
模块提供了一些方法和类来便于子进程的创建和管理。以下几个是最常用的功能:
subprocess.run()
- Python 3.5引入的一个简化接口,用于运行命令。
- 返回一个包含执行完命令后的完成状态(
CompletedProcess
对象)。 - 主要参数:
args
: 要执行的命令和参数。input
: 输入到子进程的数据。capture_output
: 如果为True
,将捕获标准输出和标准错误。text
: 如果为True
,则以文本模式处理,并返回字符串,否则返回字节。check
: 如果为True
且命令返回非零退出状态码,将引发CalledProcessError
。timeout
: 设置命令执行的超时时间。
import subprocess
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)
subprocess.Popen
- 更加灵活复杂的接口,适合需要长期运行和交互性较强的子进程。
- 提供对输入/输出/错误管道的直接访问。
- 常用方法:
Popen.communicate()
: 与进程进行交互。Popen.wait()
: 等待进程完成。Popen.poll()
: 检查进程状态。Popen.terminate()
: 终止进程。Popen.kill()
: 强制终止进程。
import subprocess
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
stdout, stderr = process.communicate()
print('stdout:', stdout)
print('stderr:', stderr)
其他有用的函数
subprocess.call()
: 运行命令,直到命令完成,将返回状态码。subprocess.check_call()
: 类似于call()
,但如果返回状态码非零则会抛出异常CalledProcessError
。subprocess.check_output()
: 运行命令并返回其输出,返回非零状态码也会抛出异常。
进程交互
通过设置stdin
、stdout
和stderr
参数来控制子进程输入和输出,可以使用PIPE
值将这些管道连接到父进程。这样可以与子进程进行交互,例如发送输入和接收输出。
注意事项
- 始终小心处理输入数据,以避免命令注入攻击,尤其是当参数由用户输入时。
- 考虑使用
shlex
模块用于将命令行字符串解析为安全的参数列表。 - 在处理文本时,检查命令输出的编码以避免乱码问题。
subprocess
模块是一个有效处理进程的工具,适合需要控制子进程行为或获取其输出的场景。通过灵活使用此模块,可以大大增强程序对外部工具的集成能力。