Python subprocess模块来执行linux命令
1. 引言
在Python中,我们经常需要执行一些与操作系统相关的任务,如执行shell命令、调用外部程序等。为此,Python提供了subprocess模块,可以方便地执行linux命令。
本文将详细介绍subprocess模块的使用方法,并提供一些示例代码来演示其功能和用法。
2. subprocess模块简介
subprocess模块是Python中一个强大的模块,用于创建和管理子进程。它提供了许多函数和类,用于执行外部命令、与子进程进行交互,并获取执行结果。
具体来说,subprocess模块提供了多个函数用于执行外部命令。其中最常用的函数包括:
subprocess.run(command, ...)
: 执行给定的命令,并等待其完成。返回一个CompletedProcess
对象,包含命令的执行结果。subprocess.Popen(command, ...)
: 执行给定的命令,但并不等待其完成。返回一个Popen
对象,可以在后续操作中与子进程进行交互。
此外,subprocess模块还提供了其他函数和类,如subprocess.check_output()
用于执行命令并返回输出结果,subprocess.call()
用于执行命令并返回状态码等。
3. 执行简单的命令示例
在这个示例中,我们将展示如何使用subprocess模块执行简单的linux命令,并获取其输出结果。
import subprocess
# 执行命令并获取输出结果
result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
print(result.stdout)
运行上述代码,将会执行ls -l
命令并打印出结果。在这个例子中,我们使用了subprocess.run()
函数来执行命令,并通过设置capture_output=True
和text=True
来捕获输出结果并以文本形式返回。
4. 与子进程进行交互示例
除了执行简单命令外,我们还可以通过subprocess模块与子进程进行交互,并向其发送输入数据。
import subprocess
# 执行交互式命令,并发送输入数据
process = subprocess.Popen(["grep", "hello"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
output, error = process.communicate("hello world")
print(output)
运行上述代码,将会执行grep hello
命令,并将"hello world"
作为输入数据发送给子进程。然后,我们将获取到子进程的输出结果,并打印出来。
5. 错误处理示例
subprocess模块还提供了一些函数和属性,用于处理命令执行过程中可能发生的错误。
import subprocess
try:
result = subprocess.run(["invalid_cmd"], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:
print("Command execution failed with return code ", e.returncode)
print("Error message:", e.stderr)
在这个示例中,我们故意执行一个无效的命令invalid_cmd
,并通过设置check=True
来捕获异常。如果命令执行失败,将会抛出subprocess.CalledProcessError
异常,并打印出错误信息。
6. 结束子进程示例
有时候,我们可能需要手动结束正在执行的子进程。subprocess模块提供了一个terminate()
方法用于结束子进程。
import subprocess
import time
# 执行命令并等待一段时间
process = subprocess.Popen(["command"], stdout=subprocess.PIPE)
time.sleep(5)
# 结束子进程
process.terminate()
process.wait()
print("Process ended")
在这个示例中,我们使用subprocess.Popen()
函数启动一个子进程,然后等待5秒钟后手动结束该子进程。最后,我们打印出一条消息表示子进程已经结束。
7. 总结
通过subprocess模块,我们可以方便地执行linux命令,并获取命令的执行结果。无论是执行简单命令,还是与子进程进行交互,subprocess模块都提供了丰富的函数和类来满足我们的需求。