Python子进程管理:subprocess模块

在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就可以轻松在命令行级别扩展它的能力。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容