subprocess模块使用,轻松调用外部命令

导读

subprocess模块是在Python2.4版本之后引入的,来调用外部命令,完成一些复杂的交互式操作

引入subprocess模块目的是了替换下列方法或模块的使用,并实现更高级的操作

os.systemos.popenos.popen2os.popen3os.popen4commands模块

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类来完成复杂功能

最后

如果内容有误,欢迎评论区指正!

喜欢我的朋友们,麻烦点一波关注,谢谢!