Python3运行Shell命令

在Python中,我们可以通过subprocess模块来运行Shell命令。这使我们能够在Python脚本中执行各种命令行操作,从而扩展我们的程序的功能和灵活性。

本文将介绍如何使用Python3运行Shell命令,并提供一些示例来帮助您更好地理解。

subprocess模块

subprocess模块是Python标准库中的一个模块,它提供了在Python脚本中运行子进程的功能。这个模块允许我们启动一个新的进程,与其进行交互,并获取其输出。

subprocess模块中的run函数是最常用的函数,它用于运行Shell命令。它接受一个命令字符串作为参数,并返回一个CompletedProcess对象,其中包含命令的执行结果。

import subprocess

result = subprocess.run("ls", shell=True, capture_output=True, text=True)
print(result.stdout)

上述代码中,我们使用subprocess.run函数运行了一个Shell命令ls,并将结果保存在result变量中。shell=True参数告诉subprocess.run函数使用Shell解释器来执行命令。capture_output=True参数将命令的输出捕获到result.stdout属性中。text=True参数将result.stdout属性的内容以字符串形式返回。

运行简单的Shell命令

让我们来看一些简单的示例来演示如何运行Shell命令。

示例1:输出Hello World

import subprocess

result = subprocess.run("echo Hello World", shell=True, capture_output=True, text=True)
print(result.stdout)

上述代码中,我们运行了一个简单的Shell命令echo Hello World,将结果打印到标准输出。

示例2:列出目录中的文件

import subprocess

result = subprocess.run("ls", shell=True, capture_output=True, text=True)
print(result.stdout)

上述代码中,我们运行了一个Shell命令ls,它会列出当前目录中的所有文件和文件夹,并将结果打印到标准输出。

示例3:创建目录

import subprocess

result = subprocess.run("mkdir new_dir", shell=True)

上述代码中,我们运行了一个Shell命令mkdir new_dir,它会在当前目录中创建一个名为new_dir的新目录。

与子进程进行交互

subprocess模块还允许我们与子进程进行交互。我们可以向子进程发送输入,读取其输出,并等待其完成。

让我们来看一些示例来演示如何与子进程进行交互。

示例4:向子进程发送输入

import subprocess

result = subprocess.run("grep hello", shell=True, capture_output=True, text=True, input="Hello World\nhello\n")
print(result.stdout)

上述代码中,我们运行了一个Shell命令grep hello,它会从输入中查找包含hello的行。我们使用input参数向子进程发送输入,然后将子进程的输出打印到标准输出。

示例5:等待子进程完成

import subprocess

result = subprocess.run("sleep 5", shell=True)
print("子进程完成")

上述代码中,我们运行了一个Shell命令sleep 5,它会让子进程休眠5秒。然后我们打印子进程完成消息。

错误处理

当运行Shell命令时,有时会出现错误。subprocess.run函数会返回一个CompletedProcess对象,其中包含命令的执行结果。

CompletedProcess对象具有以下属性:

  • args:运行的命令
  • returncode:命令的退出状态码
  • stdout:命令的标准输出
  • stderr:命令的标准错误输出

让我们来看一些示例来演示如何处理错误。

示例6:处理命令执行失败的情况

import subprocess

result = subprocess.run("command_not_found", shell=True, capture_output=True, text=True)
if result.returncode != 0: