subprocess模块是python自带的,安主要用来取代一些旧的模块或方法,如os.system、os.spawn*、os.popen*、commands.*,因此如果需要用python调用外问命令或任务时,则优先使用subprocess模块。使用subprocess模块可以方便地执行操作系统支持的命令。
一、subprocess.run()方法:
subprocess.run()方法是官方推荐使用的方法,几乎所有工作都可以由它来完成。它的函数原型:
subprocess.run(args,*,stdin=None,input=None,stdout=None,stderr=None,shell=False,cwd=None,timeout=None,check=False,encoding=None,errors=None)
该函数返回一个CompletedProcess类的实例,常用参数:
agrs 代表需要在操作系统中执行的命令,可以是字符串形式(要求shell=True),也可以是列表类型。
* 代表可变参数,一般是列表或字典形式。
stdin、stdout、stderr 指定了可执行程序的标准输入、标准输出、标准错误文件句柄。
shell 代表程序是否需要在shell上执行,当想使用shell的特性时,设置shell=True,这样就可以使用shell指令的管道、文件名称通配符、环境变量等。
check 如果check设置为True,就会检查命令的返回值,当返回值为非0时,将抛出CalledProcessError异常。
timeout 设置超时时间,如果超时,则强制KILL掉子进程。
示例代码:
1 #方法一 2 a=subprocess.run(r"whoami /LOGONID",shell=True) 3 print("1",a) 4 print("2",a.args) 5 print("3",a.returncode) 6 print("------------------------------------------------------") 7 #方法二 8 b = subprocess.run(["whoami","/LOGONID"]) 9 print("1",b) 10 print("2",b.args) 11 print("3",b.returncode) 12 #如果要捕获命令输出: 13 print("------------------------------------------------------") 14 c = subprocess.run(["whoami","/LOGONID"],stdout=subprocess.PIPE) 15 print("1",c) 16 print("2",c.args) 17 print("3",c.returncode) 18 print("4",c.stdout)
返回结果:
S-1-5-5-0-473313
1 CompletedProcess(args='whoami /LOGONID', returncode=0)
2 whoami /LOGONID
3 0
------------------------------------------------------
S-1-5-5-0-473313
1 CompletedProcess(args=['whoami', '/LOGONID'], returncode=0)
2 ['whoami', '/LOGONID']
3 0
------------------------------------------------------
1 CompletedProcess(args=['whoami', '/LOGONID'], returncode=0, stdout=b'S-1-5-5-0-473313\r\n')
2 ['whoami', '/LOGONID']
3 0
4 b'S-1-5-5-0-473313\r\n'
如果传入参数check=True,当returncode不为0时,将会抛出subprocess.CalledProcessError异常;如果传入timeout参数,当运行时间超过timeout时将会抛出TimeoutExpired异常。