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()
函数时,可以通过stdout
和stderr
参数来控制命令的输出结果和错误信息的处理方式。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)