在Python里运行外部命令或程序,subprocess模块堪称是标准库中的瑞士军刀。这个模块让控制和管理子进程变成可能,能够运行系统命令,读取它们的输出,提供输入等。下面让我们了解如何在Python中使用subprocess。
基础使用:运行外部命令
需要运行外部命令,可以借助subprocess.run()。这个方法简单直接,把要运行的命令作为参数传递进去:
import subprocess
result = subprocess.run(['ls', '-l'],capture_output=True)
capture_output=True意味着要捕获命令的标准输出(stdout)和标准错误(stderr)。
数据交互:发送输入和读取输出
想要向命令发送数据,或者读取命令的输出,可以使用subprocess.Popen()。这是一个更灵活的方法,它创建了一个新的进程,并连接到它的输入/输出/错误管道:
process = subprocess.Popen(['grep','python'], stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
output, error =process.communicate(input='subprocess is a python module\nanotherline'.encode('utf-8'))
communicate()方法用于和子进程交互,发送数据到stdin,并读取stdout和stderr。这里需要先把字符串编码为字节。
管理子进程:等待完成
运行一个长时间运行的外部命令时,我们可能需要等待它完成。使用wait()方法:
process = subprocess.Popen(['sleep', '2'])
process.wait()
这段代码启动了一个会休眠两秒钟的进程,然后等待它结束。
错误处理:捕捉异常
当被调用的命令以非零代码结束时,subprocess.run()方法会抛出CalledProcessError异常。可以捕获这个异常来作出相应处理:
try:
subprocess.run(['false'], check=True)
except subprocess.CalledProcessError as e:
print(f'哎呀,命令执行出错了,错误代码:{e.returncode}')
设定超时:防止子进程长期运行
偶尔会遇到子进程卡住无法结束的情况,这时可以利用timeout参数强制进程在给定时间内结束:
try:
subprocess.run(['sleep', '10'], timeout=5)
except subprocess.TimeoutExpired as e:
print('处理时间太长,强制结束。')
如果进程在5秒内未能结束,则会抛出TimeoutExpired异常。
使用subprocess模块,可以在Python中执行几乎所有外部命令,subprocess提供了强大的进程创建和管理功能。不管是简单的命令调用,还是需要复杂交互的脚本执行,subprocess都能派上大用场。掌握了subprocess,Python就可以轻松在命令行级别扩展它的能力。