Python的subprocess
模块是一个非常强大的工具,用于启动和与外部进程进行交互。它允许执行外部命令、访问系统Shell、管道数据、捕获输出和错误信息,以及更多。
本文详细介绍 subprocess
模块的各个方面,包括如何执行外部命令、传递参数、处理输入输出、错误处理以及一些高级应用。
1. 介绍
subprocess
模块是Python的标准库中的一部分,它允许与外部进程进行交互。这对于执行系统命令、调用其他可执行文件、处理数据流以及与其他进程通信非常有用。无论是需要执行简单的命令还是需要与复杂的外部程序进行交互,subprocess
都可以胜任。
在接下来的内容中,我们将学习如何使用subprocess
模块来执行外部命令、处理输入输出、捕获错误信息,并探讨一些高级用法。我们还会讨论一些安全性方面的注意事项,以确保您的程序不受到潜在的安全漏洞的威胁。
2. 执行外部命令
2.1 使用subprocess.run()
subprocess.run()
是Python 3.5及更高版本引入的函数,用于运行外部命令并等待其完成。
以下是一个简单的示例,演示如何使用subprocess.run()
来执行ls
命令并获取其输出:
import subprocess
result = subprocess.run(["ls", "-l"], stdout=subprocess.PIPE, text=True)
print(result.stdout)
在上面的示例中,subprocess.run()
接受一个包含命令及其参数的列表,通过stdout=subprocess.PIPE
参数捕获标准输出,并使用text=True
参数指定输出为文本。最后,我们打印了result.stdout
以获取ls -l
命令的输出。
2.2 使用subprocess.Popen()
subprocess.Popen()
提供了更多的灵活性,允许与进程进行交互,而不仅仅是等待它完成。
以下是一个使用subprocess.Popen()
的示例,演示如何执行外部命令并获取其输出:
import subprocess
# 执行命令
process = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
# 读取标准输出和错误
out, err = process.communicate()
print("标准输出:")
print(out)
print("标准错误:")
print(err)
在上面的示例中,首先使用subprocess.Popen()
来启动进程,并指定stdout=subprocess.PIPE
和stderr=subprocess.PIPE
以捕获标准输出和标准错误。然后,使用process.communicate()
方法来等待进程完成并获取其输出。
2.3 指定执行路径
使用cwd
参数来指定执行外部命令的工作目录。例如,要在特定目录中执行命令,可以这样做:
import subprocess
result = subprocess.run(["ls", "-l"], stdout