关于datetime/time/commands
模块的内容能够点击python内置模块查看。html
subprocess
模块用来生成子进程,并能够经过管道链接它们的输入/输出/错误,以及得到它们的返回值。python
该命令相似commands
模块中的getoutput()
,执行cmd
命令返回执行结果。
android
1 2 3 4 5 6 7 |
>>> PIDS = subprocess.getoutput("netstat -aon | findstr 0:80") >>> print(PIDS) TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4 >>> PIDS1 = subprocess.getoutput("netstat -aon | grep 0:80") >>> print(PIDS1) 'grep' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 |
该命令相似commands
模块中的getstatusoutput()
,执行cmd
命令返回包含2个元素的元组。
第一个元素为命令执行状态(int),若是执行成功返回0,不成功返回非0。
第二个元素为命令执行结果(str)。shell
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>> import subprocess >>> PIDS = subprocess.getstatusoutput("netstat -aon | findstr 0:80") >>> print(PIDS) #输出结果为元组 (0, ' TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4\n TCP 192.168.0.102:64793 111.202.100.60:80 TIME_WAIT 0') >>> PIDS1 = subprocess.getstatusoutput("netstat -aon | grep 0:80") >>> print(PIDS1) (255, "'grep' 不是内部或外部命令,也不是可运行的程序\n或批处理文件。") >>> status, result = subprocess.getstatusoutput("netstat -aon | grep 0:80") #python中典型使用方法 >>> print(status) 255 >>> print(result) 'grep' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 |
参数说明python2.7
1 |
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None) |
执行命令并返回执行状态,其中shell参数为False
时,命令须要以列表的方式传入,当shell为True
时,可直接传入命令。默认状况下shell=False
。
shell=False
状况函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
>>> import subprocess >>> a = subprocess.call("ls") #单个不带参数的命令可直接执行 anaconda-ks.cfg >>> print(a) #命令执行结果 0 >>> b = subprocess.call("ls -l") #带参数命令直接传入将会报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.7/subprocess.py", line 524, in call return Popen(*popenargs, **kwargs).wait() File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__ errread, errwrite) File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory >>> b = subprocess.call(["ls", "-l"]) #带参数命令以列表方式传入 total 4 -rw-------. 1 root root 2523 Apr 21 2016 anaconda-ks.cfg >>> print(b) 0 |
shell=True
状况ui
1 2 3 4 5 6 |
>>> import subprocess >>> a = subprocess.call("ls -l", shell=True) #带参数命令也可直接传入 total 4 -rw-------. 1 root root 2523 Apr 21 2016 anaconda-ks.cfg >>> print(a) 0 |
参数说明spa
1 |
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None) |
执行命令,若返回状态码为0,则返回0
,不然抛出异常CalledProcessError
。
注意:该方法等价于python3.5中的run(..., check=True)
。code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
>>> import subprocess >>> a = subprocess.check_call(["ls", "-l"]) total 4 -rw-------. 1 root root 2523 Apr 21 2016 anaconda-ks.cfg >>> print(a) 0 >>> a = subprocess.check_call("ls -l", shell=True) total 4 -rw-------. 1 root root 2523 Apr 21 2016 anaconda-ks.cfg >>> print(a) 0 >>> b = subprocess.check_call("exit 1", shell=True) #即便正确执行命令,但返回值不为0抛出异常 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.7/subprocess.py", line 542, in check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1 |
语法说明htm
1 |
args, *, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None |
执行命令,若返回状态码为0,则返回执行结果
,不然抛出异常CalledProcessError
。
注意:该方法等价于python3.5中的run(..., check=True, stdout=PIPE).stdout
1 2 3 4 5 6 7 8 9 10 11 12 |
>>> import subprocess >>> a = subprocess.check_output("ls -l", shell=True) >>> print(a) #输出为执行结果 total 4 -rw-------. 1 root root 2523 Apr 21 2016 anaconda-ks.cfg >>> b = subprocess.check_output("exit 1", shell=True) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.7/subprocess.py", line 575, in check_output raise CalledProcessError(retcode, cmd, output=output) subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1 |
python 3.5添加的函数。
语法说明:
1 |
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None) |
执行指定命令,等待命令执行完成后返回一个包含执行结果的CompleteProcess
类的实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
>>> subprocess.run("dir", shell=True) 驱动器 C 中的卷没有标签。 卷的序列号是 A001-9D89 C:\Users\xiaohuihui 的目录 2018/04/19 20:30 <DIR> . 2018/04/19 20:30 <DIR> .. 2017/11/17 10:16 <DIR> .android ............................................ ........................................... 2018/01/23 16:23 0 2.txt 2018/04/16 06:45 <DIR> 3D Objects 2018/04/13 20:28 4 bacon.txt 8 个文件 1,029,964,132 字节 24 个目录 94,803,804,160 可用字节 CompletedProcess(args='dir', returncode=0) >>> subprocess.run("exit 1", shell=True, check=True) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\xiaohuihui\AppData\Local\Programs\Python\Python36\lib\subprocess.py", line 418, in run output=stdout, stderr=stderr) subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1. >>> subprocess.run("netstat -aon|findstr 0:80", shell=True, stdout=subprocess.PIPE) CompletedProcess(args='netstat -aon|findstr 0:80', returncode=0, stdout=b' TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4\r\n') |
subprocess中的call()
、check_call()
、check_output()
以及run()
参数列表已经列出,下面是参数的说明
['df', '-hT']
或('df', '-hT')
,也能够是一个字符串,如'df -hT'
,但此时须要把shell参数的值设置为True
。CalledProcessError
异常,且该异常对象会包含参数、退出状态码以及stdout和stderr(若被捕获)。subprocess.PIPE
而后能够经过返回的CompleteProcess
类实例的stddout和stderr属性捕获相应的内容。CompleteProcess
类实例,因此它们的stdout和stderr不适合赋值为subprocess.PIPE
。stderr = subprocess.STDOUT
。Popen.communicate()
,一般该参数的值必须是一个字节序列,若是universal_newline=True
,则其值应该是一个字符串。subprocess.CompleteProcess
类在python3.5中才存在,表示一个已经结束进程的状态信息,包含的属性以下
-N
表示子进程被信号N终止。universal_newlines=True
,则该属性值是一个字符串。若是run()函数被调用时指定stderr=subprocess.STDOUT
,那么stdout和stderr将会被整合到这一个属性中,且stderr将会为Nonereturncode
是一个非0值,则该方法会抛出一个CalledProcessError
异常。该类用于在一个新的进程中执行一个子程序。上面介绍的函数都是基于subprocess.Popen
类实现的,经过使用这些被封装后的高级函数能够很方便的完成一些常见的需求。当没法经过上面的高级函数实现一些不太经常使用的功能时,能够经过subprocess.Popen
来完成。
示例1
1 2 3 4 |
>>> import subprocess >>> p = subprocess.Popen("netstat -aon|findstr 0:80", shell=True, stdout=subprocess.PIPE) >>> print(p.stdout.read()) b' TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4\r\n' |
示例2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
>>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) >>> obj.stdin.write('print(1) \n') #返回写入的字符数 10 >>> obj.stdin.write('print(2) \n') 10 >>> obj.stdin.write('print(3) \n') 10 >>> out,err = obj.communicate() >>> print(out) 1 2 3 >>> print(err) |
总结
更多关于subprocess说明可点击查看官方文档。