Python_子进程管理subprocess模块
subprocess中,允许生成新的进程,连接到input/output/error管道,并获取他们的返回(状态)码,主要用于替换os.system/os.spawn*几个旧的模块和方法
subprocess模块常用函数:
subprocess.run(args,*,stdin=None,input=None, stdout=None,stderr=None, shell=False, timeout=None, check=False,universal_newlines=False) |
python 3.5新增函数,用于执行指定的命令,命令完成后返回一个包含 执行结果的completedProcess类的实例 |
stdout,stderr :默认不会捕获命令执行结果的正常输出和错误输出,若我们要获取这些内容,则需传递dubprocess.PIPE获取相应内容 |
|
subprocess.call(args,*,stdin=None,stdout=None, stderr=None,shell=False,timeout=None) |
执行指定的命令,返回命令执行状态,在Python3.5过后的版本已经弃用 |
subprocess.check_call(args,*,stdin=None,stdout=None, stderr=None,shell=False,timeout=None) |
执行指定的命令,若指定成功则返回状态码,否则抛出异常,等价与subprocess.run(...,check=True) |
call(),check_call()中stdout/stderr默认会返回命令执行状态码,所以stdout/stderr不适合赋值为subprocess.PIPE | |
subprocess.check_output(args,*,stdin=None,stderr=None, shell=False,universal_newlines=False,timeout=None) |
执行指定命令,若执行状态码为0则返回命令执行结果,否则抛出异常 |
stdout/stderr中函数默认返回命令执行结果,若结果中需捕获错误信息,可执行stderr=subprocess.STDOUT | |
subprocess.getoutput(cmd) |
接收字符串格式的命令,执行指定命令,获取执行结果,但无法获取命 令执行状态功能类似os.popen(cmd).read() |
subprocess.getstatusoutput(cmd) | 执行cmd命令,返回一个元组(命令执行状态,命令执行结果输出) |
args:要执行的shell命令,默认为字符串序列如['df','-Th']或('df','-Th'),为单独字符串时‘df-Th’,须设置shell=True | |
shell:若shell=True,指定的命令将通过shell执行,或run访问管道,文件名通配符,环境变量等扩展功能时 | |
check:若check=True,切执行命令的进程以非0状态码退出时,则会抛出calledprocesserror异常,该异常可能会包含参数、退出状态码、stdout/stderr等 | |
input:该参数是传递给Popen.communicate(),通常该参数的值必须是一个字节序列,若universal_newlines=True,则该值为一个字符串 | |
universal_newlines:该参数影响输入与输出的数据格式默认为False,stdout/stderr输出字节序列,反之,为字符串序列 |
注:在Python3.5之后的版本,建议使用subprocess.run()函数来替代subprocess.call()和其他函数来使用subprocess模块的功能使用
实例:
实例:
实例:
1.subprocess.CompletedProcess类
subprocess.run()函数返回值(一个实例)
2. subprocess.Popen类
call()无法获取执行命令的结果,然而可以通过Popen()+管道的使用 (stdout=subprocess.PIPE)获取执行命令执行的结果
subprocess.Popen()的构造函数:
args | 执行shell命令,可以是字符串也可以是各个参数组成的序列 |
bufsize | 缓存策略,0表示不缓冲,1表示行缓冲,大于1的数字表示缓冲区太小,负数表示使用系统默认缓存策略 |
stdin,stdout,stderr | 表示程序的标准输入、输出、错误句柄 |
preexec_fn | 用于指定一个将在子进程进行之前被调用的可执行对象(在Unix平台下有效) |
clase_fds | 在Windows平台下,设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道 |
shell | 用于标识是否使用shell作为执行的程序,shell=True,表示将args作为字符串传递 |
cwd | 设置子进程当前目录,若cwd!=None,则该函数将会在执行这个子进程之前改变当前工作目录 |
env | 用于指定子进程的环境变量,若env=None,则子进程的环境变量将从父进程中继承,否则它的值必须是一个映射对象 |
universal_newlines | True,则该文件对象的stdin,stdout,stderr将会作为文本流被打开,否则他们将会被作为二进制流被打开 |
startupinfo/creationflags | 只有在Windows下有效,他们将被传递给底层的CreatProcess()函数,用于设置子进程的一些属性,如进程优先级等 |
subprocess.Popen类可调用的方法:
Popen.poll() | 用于检查子进程(命令)是否已经执行结束,没有结束返回None,结束后返回状态码 |
Popen.wait(timeout=None) | 等待子进程结束,并返回状态码,若在timeout指定秒数后进程还没有结束,则抛出异常 |
Popen.communicate(input=None,timeout=None) |
用于与进程进行交互,如发送数据到stdin,或从stdout,stderr读取数据,其中timeout 参数为Python3中才增加的 |
Popen.send_signal(signal) | 停止该子进程 |
Popen.kill() | 杀死该子进程 |
实例:
笔记参考于:https://www.cnblogs.com/yyds/p/7288916.html