subprocess 是 Python 的一个标准库模块,用于在新的进程中执行子程序,并获取其输出。它允许你启动新的应用程序,连接到它们的输入/输出/错误管道,并获取它们的返回码。
以下是一些常用的 subprocess 模块的功能:
1:执行外部命令
import subprocess
subprocess.run(["ls", "-l"]) # 列出当前目录的文件
2:使用 Popen 类
import subprocess
p = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE)
output, error = p.communicate()
print(output.decode()) # 输出结果
3:使用 check_output
这是一个更方便的函数,用于捕获子进程的输出。如果子进程返回一个非零的退出码,它将会引发一个 CalledProcessError。
import subprocess
try:
output = subprocess.check_output(["ls", "-l"])
print(output.decode()) # 输出结果
except subprocess.CalledProcessError as e:
print(f"命令返回了非零的退出码: {e}")
4:使用管道:
你可以使用管道来连接多个命令或进程。例如,你可以使用 | 将两个命令连接起来,使第一个命令的输出成为第二个命令的输入。
import subprocess
subprocess.run(["echo", "hello"], stdout=subprocess.PIPE).stdout.decode().strip() | subprocess.run(["cat"], stdin=subprocess.PIPE)
5:使用 shell 参数:
当你想在 shell 中执行命令时,可以使用 shell=True 参数。但请注意,这可能会带来安全风险,因为它允许注入 shell 代码。因此,除非你完全信任输入,否则最好不要使用这个参数。
import subprocess
subprocess.run("echo hello", shell=True) # 在 shell 中执行命令
6: 错误处理
当子进程返回非零的退出码时,你可以捕获 CalledProcessError 来处理错误。
import subprocess
try:
output = subprocess.check_output(["nonexistent_command"])
except subprocess.CalledProcessError as e:
print(f"命令返回非零退出码:{e.returncode}")
except FileNotFoundError:
print("命令不存在或路径不正确")
except Exception as e:
print(f"发生未知异常:{e}")
7: 传递文件对象
你可以传递文件对象给 Popen 的 stdin, stdout, 和 stderr 参数,以便与子进程进行交互。
8:获取进程ID
你可以使用 Popen 的 pid 属性来获取子进程的进程ID。
9:等待进程完成
你可以使用 Popen 的 wait 方法来等待进程完成,并返回退出码。
10:使用其他操作系统参数
你可以使用其他操作系统参数来控制子进程的行为,例如设置环境变量、更改工作目录等。