subprocess是一个非常强大的模块,它能通过启动新进程的方式执行外部命令、访问系统Shell、管道等。
同时也能捕获这些新进程的输出和错误信息;
subprocess模块是Python的标准库中的一部分,支持 Python 3.5 及 3.5 以上版本;
3.5 以下版本需要额外安装;
执行外部命令
subprocess.run()
subprocess.run() 用于运行外部命令并等待其完成;
capture_output: 抓取输出;capture_output 参数 与 stdout,stderr 相关,
在不传入capture_output 和 stdout、stderr 的默认情况下,subprocess不会抓取 stdout 和 stderr,并且返回值对象里这两个属性为
None。传入stdout=PIPE 和 stderr=PIPE 或者 stdout=PIPE、stderr=PIPE 其中一个,subprocess会对应着抓取它们;
如果希望抓取并将两个流合并在一起,可以使用 stdout=PIPE 和 stderr=STDOUT;
直接传入 capture_output=True,subprocess会stdout、stderr两个都抓取;
因为在capture_output=True时,内置的 Popen 对象将自动用 stdout=PIPE 和 stderr=PIPE 创建管道。
所以stdout 和 stderr 参数不应当与 capture_output 同时传入。
check: 返回状态检查;check 参数和子进程运行退出状态码有关
当子进程退出时 return code(状态码) 不为 0,则会触发 CalledProcessError异常;
退出的 return code 会保存到 CalledProcessError.returncode 属性中,
如果 stdout、stderr有被抓取,则 stdout 和 stderr 也会在 CalledProcessError.stdout 和 CalledProcessError.stderr属性里;
timeout :超时时间,如果传入 timeout,并且进程花费的时间超出 timeout,则会触发TimeoutExpired异常;
text: 功能类似 universal_newlines 参数,
默认不传入的情况下,subprocess.run() 返回的stdout、stderr是字节类型,
当text或者universal_newlines为True,stdout、stderr输出是字符串类型;
cwd: 指定 subprocess 子进程工作路径;
input :向子进程传入的参数,可选参数,以下是官方文档的解释
input 参数将被传递给 Popen.communicate() 以及子进程的 stdin。它必须是一个字节序列;
如果指定了 encoding 或 errors 或者将 text 设置为 True,那么也可以是一个字符串。
当使用此参数时,在创建内部 Popen 对象时将自动带上 stdin=PIPE,并且不能再手动指定 stdin 参数。
一般使用
import subprocess
complete = subprocess.run(["ipconfig", "/all"],
capture_output=True,
text=True)
print(complete.stdout)
拼接参数
如果命令需要接受参数,可以将它们作为列表的一部分传递给subprocess.run()或subprocess.Popen()。
例如,要将文件名作为参数传递给命令,可以这样做:
import subprocess
sub_path = "data_lake"
complete = subprocess.run(["dir", sub_path],
shell=True,
capture_output=True,
text=True,
cwd="E:\\VsCodeProjects\\")
print(complete.stdout)
指定路径
使用cwd参数来指定执行外部命令的工作目录。例如,要在特定目录中执行命令,可以这样做:
import subprocess
complete = subprocess.run(["dir"],
shell=True,
capture_output=True,
text=True,
cwd="E:\\VsCodeProjects\\")
print(complete.stdout)
使用Shell命令
默认情况下,subprocess不会使用Shell来执行命令。这是出于安全考虑,以