subprocess模块

发布时间 2023-09-16 12:11:57作者: donfag

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异常。