python内置库subprocess库详解:subprocess 库允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值
前言
① subprocess 模块可以用于执行系统命令,拿到执行的结果,速度比较的快,并且它允许你创建一个新的进程让其去执行另外的程序,并与它进行通信,获取标准的输入、标准输出、标准错误以及返回码等。
②Python2.4引入 subprocess 内置模块来管理子进程,可以像Linux 系统中执行shell命令那样fork一个子进程执行外部的命令,并且可以连接子进程的output/input/error管道,获取命令执行的输出,错误信息,和执行成功与否的结果。
③使用 subprocess 模块的目的是用于替换 os.system 等一些旧的模块和方法。
④ subprocess 模块中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用。另外 subprocess 内置库还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。
⑤python执行shell脚本,通常会使用so模块中的几个方法,如system、spawn*、popen等。subprocess标准库的引入就是为了取代这些老的模块方法。subprocess使用时,父进程创建子进程去执行一个外部程序,并提供了标准输入输出和管道(pipe)的实现方法。
⑥ subprocess 模块的官方参考文档:https://docs.python.org/zh-tw/3.12/library/subprocess.html
subprocess内置模块中的常用函数
说明:
1、在Python 3.5之后的版本中,官方文档中提倡通过subprocess.run()函数替代其他函数来使用subproccess模块的功能; 2、在Python 3.5之前的版本中,我们可以通过subprocess.call(),subprocess.getoutput()等上面列出的其他函数来使用subprocess模块的功能; 3、subprocess.run()、subprocess.call()、subprocess.check_call()和subprocess.check_output()都是通过对subprocess.Popen的封装来实现的高级函数,因此如果我们需要更复杂功能时,可以通过subprocess.Popen来完成。 4、subprocess.getoutput()和subprocess.getstatusoutput()函数是来自Python 2.x的commands模块的两个遗留函数。它们隐式的调用系统shell,并且不保证其他函数所具有的安全性和异常处理的一致性。另外,它们从Python 3.3.4开始才支持Windows平台。
1、subprocess.run()
此方法为python3.5版本后的推荐方法,运行args描述的命令。等待命令完成,然后返回一个CompletedProcess实例。可以获取执行结果、返回内容等一些常用的信息,
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, universal_newlines=False)
参数解释:
- args:表示要执行的命令。必须是一个字符串,字符串参数列表。(运行由args参数提供的命令,等待命令执行结束并返回返回码。 #args参数由字符串形式提供且有多个命令参数时,需要提供shell=True参数)
- stdin、stdout 和 stderr:子进程的标准输入、输出和错误。其值可以是 subprocess.PIPE、subprocess.DEVNULL、一个已经存在的文件描述符、已经打开的文件对象或者 None。subprocess.PIPE 表示为子进程创建新的管道。subprocess.DEVNULL 表示使用 os.devnull。默认使用的是 None,表示什么都不做。另外,stderr 可以合并到 stdout 里一起输出。
- timeout:设置命令超时时间。如果命令执行时间超时,子进程将被杀死,并弹出 TimeoutExpired 异常。
- check:如果该参数设置为 True,并且进程退出状态码不是 0,则弹 出 CalledProcessError 异常。
- encoding: 如果指定了该参数,则 stdin、stdout 和 stderr 可以接收字符串数据,并以该编码方式编码。否则只接收 bytes 类型的数据。
- shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。参数shell默认为False。(可以用数组作为参数运行命令,也可以用字符串作为参数运行命令(通过设置参数 shell=True ))
举例:
import subprocess # args传入str的方式 有参数传入需shell=True,encoding可以指定capture_output(stdin、stdout、stderr)的编码格式 ret = subprocess.run('ls -l', shell=True, capture_output=True, encoding='utf-8') print(ret) # ret.returncode 返回int类型,0 则表示执行成功 print('ret.returncode: ', ret.returncode) # ret.stdout 返回str类型,命令执行后的输出内容,可以按实际需求处理str, 这里简单做个split print('ret.stdout: ', ret.stdout, sep='\n')
运行结果:
2、subprocess.call()
运行由args参数提供的命令,等待命令执行结束并返回返回码。
args参数由字符串形式提供且有多个命令参数时,需要提供shell=True参数。
subprocess.ca11(args, *, stdin=None, stdout=None, stderr=None, shell=False)
参数解释:
- args:表示要执行的命令。必须是一个字符串,字符串参数列表。
- stdin、stdout 和stderr:子进程的标准输入、输出和错误。其值可以是
- subprocess.PIPE、subprocess.DEVNULL、一个已经存在的文件描述符、已经打开的文件对象或者 None。subprocess.PIPE 表示为子进程创建新的管道。subprocess.DEVNULL 表示使用os.devnull。默认使用的是 None,表示什么都不做。另外,stderr 可以合并到 stdout 里一起输出。
- shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。
举例:
①参数命令为数组时:
import subprocess result = subprocess.call(['ls', '-lah']) print(result)
运行结果:
②参数命令为字符串时
import subprocess result = subprocess.call('ls -lah', shell=True) print(result)
运行结果:
https://blog.csdn.net/qq_43331089/article/details/124421661
https://www.jb51.net/article/142787.htm
https://blog.csdn.net/qq_25131949/article/details/122396803
https://blog.csdn.net/Yy_heng/article/details/127105045
https://blog.csdn.net/weixin_43913261/article/details/124717225?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-124717225-blog-122396803.pc_relevant_3mothn_strategy_recovery&spm=1001.2101.3001.4242.1&utm_relevant_index=3