Python subprocess模块来执行linux命令

Python subprocess模块来执行linux命令

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=Truetext=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模块都提供了丰富的函数和类来满足我们的需求。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程