Python subprocess调用终端命令详解

引言

在Python中,我们经常需要执行一些终端命令,比如运行系统命令、调用外部程序等。Python的subprocess模块提供了一个方便的接口来执行这些终端命令,并且可以获取命令的输出结果。本文将详细介绍subprocess模块的使用方法,并通过代码示例演示。

subprocess模块概述

subprocess模块是Python中用于创建子进程的模块,它提供了一种执行外部命令的简单方式。通过subprocess模块,我们可以执行终端命令,并且可以获取到命令的输出结果、错误信息等。subprocess模块提供了多个函数和类,用于不同的使用场景。

subprocess模块的常用函数和类

subprocess.run()

subprocess.run()函数是Python 3.5之后新增的函数,用于执行终端命令,并等待命令执行完成。它的用法非常简单,只需要传入要执行的命令字符串即可。下面是一个简单的示例:

import subprocess

result = subprocess.run(["ls", "-l"], capture_output=True)

print(result.stdout.decode())

上面的代码中,我们调用了subprocess.run()函数来执行ls -l命令,并通过capture_output=True参数将命令的输出结果捕获到result对象中。然后,我们通过result.stdout.decode()方法将输出结果转换为字符串,并打印出来。

subprocess.Popen()

subprocess.Popen()函数是subprocess模块中最常用的函数之一,它用于创建一个子进程,并执行指定的命令。Popen()函数的返回值是一个Popen对象,通过它可以获取到命令的输出结果、错误信息等。下面是一个示例:

import subprocess

process = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE)

output, error = process.communicate()

print(output.decode())

上面的代码中,我们调用了subprocess.Popen()函数来执行ls -l命令,并将命令的输出结果保存在output变量中。然后,我们通过output.decode()方法将结果转换为字符串,并打印出来。

subprocess.check_output()

subprocess.check_output()函数用于执行命令,并返回命令的输出结果。这个函数只能执行完整的命令,并将命令的输出结果返回给调用者。下面是一个示例:

import subprocess

output = subprocess.check_output(["ls", "-l"])

print(output.decode())

上面的代码中,我们调用了subprocess.check_output()函数来执行ls -l命令,并将结果保存在output变量中。然后,我们通过output.decode()方法将结果转换为字符串,并打印出来。

subprocess.PIPE和subprocess.STDOUT

在调用subprocess.Popen()函数时,可以通过stdoutstderr参数来控制命令的输出结果和错误信息的处理方式。subprocess.PIPE表示将输出结果或错误信息保存在一个管道中,而subprocess.STDOUT表示将错误信息合并到输出结果中。下面是一个示例:

import subprocess

process = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

output, _ = process.communicate()

print(output.decode())

上面的代码中,我们通过stdout=subprocess.PIPE参数将输出结果保存在一个管道中。然后,我们通过stderr=subprocess.STDOUT参数将错误信息合并到输出结果中。最后,我们通过output.decode()方法将结果转换为字符串,并打印出来。

subprocess模块的高级用法

除了上述介绍的一些常用函数和类外,subprocess模块还提供了一些高级的用法,用于处理更复杂的命令执行场景。

执行系统命令

有时候,我们需要执行一些系统命令,比如修改文件权限、安装软件等。subprocess模块提供了os.system()函数来执行系统命令,它的用法非常简单,只需要传入要执行的命令字符串即可。下面是一个示例:

import subprocess

subprocess.run("chmod +x script.sh", shell=True)