Python3 Subprocess- 让命令行与Python愉快交互

简介

Python是一种高级编程语言,它提供了许多内置模块和库,使编写复杂的应用程序变得容易。一个常见的任务是在Python中执行命令行命令。这通常可以通过使用Python的subprocess模块来完成。

subprocess模块

subprocess模块允许Python程序与操作系统的命令行进行交互。我们可以使用subprocess模块来执行命令行命令,并从该命令获取输出、错误消息、状态码等信息。下面是一个简单的示例:

import subprocess

result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)
print(result.stdout)

在这个例子中,我们使用subprocess.run()方法来执行ls -l命令并获取输出。stdout=subprocess.PIPE参数允许我们将输出保存到result.stdout变量中。这个变量是一个字节字符串,我们可以使用print()函数来显示它。

执行系统命令

subprocess模块允许我们执行各种系统命令。下面是一些常见的示例:

import subprocess

# 执行ls命令
result = subprocess.run(['ls'])

# 执行cat命令
result = subprocess.run(['cat', 'file.txt'])

# 执行echo命令
result = subprocess.run(['echo', 'Hello, World!'])

在这些示例中,我们使用subprocess.run()方法来执行不同的命令。每个命令都是一个包含命令和参数的列表。如果命令需要从文件中读取输入,我们可以使用stdin参数来指定输入文件的名称。

获取输出

当我们执行命令时,有时需要从该命令获取输出。subprocess模块提供了多种方法来获取输出。

使用stdout参数

我们可以使用stdout参数来指定输出的目标。下面是一个简单的示例:

import subprocess

# 获取ls命令的输出
result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)

# 显示输出
print(result.stdout)

在这个示例中,我们使用stdout=subprocess.PIPE参数将输出保存到result.stdout变量中。这个变量是一个字节字符串,我们可以使用print()函数来显示它。

使用check_output()方法

check_output()方法是subprocess模块的另一个方法,它允许我们执行命令并获取输出。下面是一个简单的示例:

import subprocess

# 获取ls命令的输出
output = subprocess.check_output(['ls', '-l'])

# 显示输出
print(output)

在这个示例中,我们使用check_output()方法执行ls -l命令并获取输出。输出被保存到output变量中,这个变量是一个字节字符串。

获取错误消息

有时我们需要获取命令的错误消息。subprocess模块提供了多种方法来获取错误消息。

Python3 Subprocess- 让命令行与Python愉快交互

使用stderr参数

我们可以使用stderr参数来指定错误消息的目标。下面是一个简单的示例:

import subprocess

# 执行一个不存在的命令
result = subprocess.run(['foo'], stderr=subprocess.PIPE)

# 显示错误消息
print(result.stderr)

在这个示例中,我们使用stderr=subprocess.PIPE参数将错误消息保存到result.stderr变量中。这个变量是一个字节字符串,我们可以使用print()函数来显示它。

使用check_call()方法

check_call()方法是subprocess模块的另一个方法,它允许我们执行命令并获取错误消息。下面是一个简单的示例:

import subprocess

# 执行一个不存在的命令
try:
    subprocess.check_call(['foo'])
except subprocess.CalledProcessError as e:
    # 显示错误消息
    print(e.stderr)

在这个示例中,我们使用check_call()方法执行一个不存在的命令,并捕获CalledProcessError异常。异常包含错误消息,我们可以使用e.stderr属性来获取它。

获取状态码

当我们执行命令时,我们通常需要获取命令的状态码。subprocess模块提供了多种方法来获取状态码。

使用returncode属性

我们可以使用returncode属性来获取命令的状态码。下面是一个简单的示例:

import subprocess

# 执行ls命令
result = subprocess.run(['ls'])

# 显示状态码
print(result.returncode)

在这个示例中,我们使用run()方法执行ls命令,并使用returncode属性获取状态码。

使用check_call()方法

check_call()方法是subprocess模块的另一个方法,它允许我们执行命令并获取状态码。下面是一个简单的示例:

import subprocess

# 执行ls命令
try:
    subprocess.check_call(['ls'])
except subprocess.CalledProcessError as e:
    # 显示状态码
    print(e.returncode)

在这个示例中,我们使用check_call()方法执行ls命令,并捕获CalledProcessError异常。异常包含状态码,我们可以使用e.returncode属性来获取它。

使用Popen对象

除了run()和check_call()方法之外,subprocess模块还提供了Popen类,它允许我们更细粒度地控制子进程的行为。下面是一个简单的示例:

import subprocess

# 创建Popen对象
p = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)

# 获取输出
output = p.communicate()[0]

# 显示输出
print(output)

在这个示例中,我们使用Popen类创建一个子进程来执行ls -l命令。stdout=subprocess.PIPE参数允许我们将输出保存到Popen对象的stdout属性中。我们可以使用communicate()方法来等待子进程完成并获取输出。

结论

subprocess模块允许Python程序与操作系统的命令行进行交互,从而使编写复杂的应用程序变得更加容易。我们可以使用subprocess模块来执行各种系统命令,并获取输出、错误消息、状态码等信息。通过结合使用run()、check_call()和Popen类,我们可以灵活地控制子进程的行为。

最后编辑于:2023/09/26作者: 心语漫舞