导读
subprocess模块是在Python2.4版本之后引入的,来调用外部命令,完成一些复杂的交互式操作
引入subprocess模块目的是了替换下列方法或模块的使用,并实现更高级的操作
- os.system
- os.popen
- os.popen2
- os.popen3
- os.popen4
- commands模块
subprocess.Popen类详解
subprocess.Popen类实例创建一个新进程,用来执行一个外部命令,Popen是subprocess模块底层一个实现类,subprocess模块其他调用外部命令的高级方法都是基于Popen类封装
所以subprocess.Popen类掌握了解非常重要!
subprocess.Popen类构造器
subprocess模块高级函数
subprocess模块高级函数涉及到:
- subprocess.call()
- subprocess.check_call()
- subprocess.check_output()
- subprocess.getstatusoutput)
- subprocess.getoutput()
- subprocess.run()
subprocess.call方法
subprocess.call(args, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
说明:在Python 2.4版本引入对方法,调用外部命令,返回命令状态码
使用示例:
subprocess.check_call方法
subprocess.check_call(args, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
说明:在Python 2.5版本引入的方法,与call方法类似,不同在于如果命令执行成功,返回状态码0,否则抛出
subprocess.CalledProcessError异常
使用示例:
subprocess.check_output方法
subprocess.check_output(args, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None)
说明:在Python 2.7版本引入的方法,与call方法类似,返回执行的结果,如果执行异常,则抛出
subprocess.CalledProcessError异常
使用示例:
subprocess.getstatusoutput、subprocess.getoutput方法
- subprocess.getstatusoutput(cmd) 调用外部命令,返回一个元组结构,第一个元素是命令执行状态,第二个为执行结果
- subprocess.getoutput(cmd) 调用外部命令,返回执行的结果
subprocess.run方法,subprocess.CompletedProcess类
subprocess.run(args, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, universal_newlines=False)
subprocess.run()是Python3.5中新增的一个高级函数,调用外部命令,其返回值是
subprocess.CompletedPorcess类的实例
该
subprocess.CompletedProcess类表示一个已结束进程的状态信息
subprocess.CompletedProcess类实例属性有:
- args: 进程支持命令,列表或字符串
- returncode: 进程的退出状态码
- stdout: 从子进程捕获的stdout,其值是字节序列或字符串,当universal_newlines=True,其值为字符串
- stderr: 从子进程捕获的stderr,其值与stdout一样,是一个字节序列或一个字符串
- check_returncode(): 如果returncode是一个非0值,则该方法会抛出一个CalledProcessError异常
使用示例:
一些参数说明
以上高级方法,在使用上大同小异,方法参数基本一致:
- args: 要执行的命令,可以是字符串,也可以是命令及各参数组成的序列
- shell:
shell为True,args参数使用字符串
shell为True,args参数使用序列 - stdin, stdout, stderr 分别表示程序标准输入、输出、错误
- input,发送给子进程的数据,如没有数据发送给子进程,input=None,如果universal_newlines=True,则input参数的数据类型必须是字符串
- check: check为True,进程退出状态码非0,则抛出CalledProcessError异常
使用建议
- subprocess.run()、subprocess.call()、subprocess.check_call()、subprocess.check_output()等调用外部命令方法都是subprocess.Popen类封装实现
- Python2.x中的commands模块,在Python3中被彻底被移除,commands模块下的getoutput()和getstatusoutput()函数被迁移到subprocess模块下,即subprocess.getoutput()和subprocess.getstatusoutput()
- Python 2.4~Python 3.5之间,保证兼容性,推荐使用subprocess.call()方法
- Python 3.5版本以上,尽量使用subprocess.run()方法
- 一些复杂操作,使用subprocess.call()、subprocess.check_call()、subprocess.check_output()和subprocess.run()没法完成,可以使用subprocess.Popen类来完成复杂功能
最后
如果内容有误,欢迎评论区指正!
喜欢我的朋友们,麻烦点一波关注,谢谢!