Pythonsubprocess模块功能与常见用法实例详解
2023年7月10日发(作者:)
Pythonsubprocess模块功能与常见⽤法实例详解⽬录⼀、简介⼆、旧有模块的使⽤()2. ()三、subprocess模块1、()2、()3、_call()4、tusoutput()5、put()6、_output()四、()1、stdout2、stderr4、poll()5、wait()6、terminate()7、pid本⽂实例讲述了Python subprocess模块功能与常见⽤法。分享给⼤家供⼤家参考,具体如下:⼀、简介subprocess最早在2.4版本引⼊。⽤来⽣成⼦进程,并可以通过管道连接他们的输⼊/输出/错误,以及获得他们的返回值。subprocess⽤来替换多个旧模块和函数:**popen2.*commands.*运⾏python的时候,我们都是在创建并运⾏⼀个进程,linux中⼀个进程可以fork⼀个⼦进程,并让这个⼦进程exec另外⼀个程序。在python中,我们通过标准库中的subprocess包来fork⼀个⼦进程,并且运⾏⼀个外部的程序。subprocess包中定义有数个创建⼦进程的函数,这些函数分别以不同的⽅式创建⼦进程,所欲我们可以根据需要来从中选取⼀个使⽤。另外subprocess还提供了⼀些管理标准流(standard stream)和管道(pipe)的⼯具,从⽽在进程间使⽤⽂本通信。⼆、旧有模块的使⽤()执⾏操作系统的命令,将结果输出到屏幕,只返回命令执⾏状态(0:成功,⾮ 0 : 失败)import os>>> a = ("df -Th")Filesystem Type Size Used Avail Use% Mounted on/dev/sda3 ext4 1.8T 436G 1.3T 26% /tmpfs tmpfs 16G 0 16G 0% /dev/shm/dev/sda1 ext4 190M 118M 63M 66% /boot>>> a0 # 0 表⽰执⾏成功# 执⾏错误的命令>>> res = ("list")sh: list: command not found>>> res32512 # 返回⾮ 0 表⽰执⾏错误2. ()执⾏操作系统的命令,会将结果保存在内存当中,可以⽤read()⽅法读取出来import os>>> res = ("ls -l")# 将结果保存到内存中>>> print res# ⽤read()读取内容>>> print ()total 267508-rw-r--r-- 1 root root 260968 Jan 27 2016 -rw-------. 1 root root 1047 May 23 2016 -rw-r--r-- 1 root root 9130958 Nov 18 2015 -rw-r--r-- 1 root root 0 Oct 31 2016 xr-xr-x 5 root root 4096 Jul 27 2016 certs-builddrwxr-xr-x 2 root root 4096 Jul 5 16:54 Desktop-rw-r--r-- 1 root root 2462 Apr 20 11:50 Face_三、subprocess模块1、()>>> import subprocess# python 解析则传⼊命令的每个参数的列表>>> (["df","-h"])Filesystem Size Used Avail Use% Mounted on/dev/mapper/VolGroup-LogVol00 289G 70G 204G 26% /tmpfs 64G 0 64G 0% /dev/shm/dev/sda1 283M 27M 241M 11% /bootCompletedProcess(args=['df', '-h'], returncode=0)# 需要交给Linux shell⾃⼰解析,则:传⼊命令字符串,shell=True>>> ("df -h|grep /dev/sda1",shell=True)/dev/sda1 283M 27M 241M 11% /bootCompletedProcess(args='df -h|grep /dev/sda1', returncode=0)2、()执⾏命令,返回命令的结果和执⾏状态,0或者⾮0>>> res = (["ls","-l"])总⽤量 28-rw-r--r-- 1 root root 0 6⽉ 16 10:28 1drwxr-xr-x 2 root root 4096 6⽉ 22 17:48 _1748-rw-------. 1 root root 1264 4⽉ 28 20:51 xr-xr-x 2 root root 4096 5⽉ 25 14:45 monitor-rw-r--r-- 1 root root 13160 5⽉ 9 13:36 # 命令执⾏状态>>> res03、_call()执⾏命令,返回结果和状态,正常为0 ,执⾏错误则抛出异常>>> _call(["ls","-l"])总⽤量 28-rw-r--r-- 1 root root 0 6⽉ 16 10:28 1drwxr-xr-x 2 root root 4096 6⽉ 22 17:48 _1748-rw-------. 1 root root 1264 4⽉ 28 20:51 xr-xr-x 2 root root 4096 5⽉ 25 14:45 monitor-rw-r--r-- 1 root root 13160 5⽉ 9 13:36 0>>> _call(["lm","-l"])Traceback (most recent call last): File "", line 1, in File "/usr/lib64/python2.7/", line 537, in check_call retcode = call(*popenargs, **kwargs) File "/usr/lib64/python2.7/", line 524, in call return Popen(*popenargs, **kwargs).wait() File "/usr/lib64/python2.7/", line 711, in __init__ errread, errwrite) File "/usr/lib64/python2.7/", line 1327, in _execute_child raise child_exceptionOSError: [Errno 2] No such file or directory4、tusoutput()接受字符串形式的命令,返回 ⼀个元组形式的结果,第⼀个元素是命令执⾏状态,第⼆个为执⾏结果#执⾏正确>>> tusoutput('pwd')(0, '/root')#执⾏错误>>> tusoutput('pd')(127, '/bin/sh: pd: command not found')5、put()接受字符串形式的命令,放回执⾏结果>>> put('pwd')'/root'6、_output()执⾏命令,返回执⾏的结果,⽽不是打印>>> res = _output("pwd")>>> resb'/rootn' # 结果以字节形式返回四、()其实以上subprocess使⽤的⽅法,都是对的封装,下⾯我们就来看看这个Popen⽅法。1、stdout标准输出>>> res = ("ls /tmp/", shell=True, stdout=) # 使⽤管道>>> () # 标准输出b'/tmp/'() # 关闭2、stderr标准错误>>> import subprocess>>> res = ("lm -l",shell=True,stdout=,stderr=)# 标准输出为空>>> ()b''#标准错误中有错误信息>>> ()b'/bin/sh: lm: command not foundn'注意:上⾯的提到的标准输出都为啥都需要等于,这个⼜是啥呢?原来这个是⼀个管道,这个需要画⼀个图来解释⼀下:4、poll()定时检查命令有没有执⾏完毕,执⾏完毕后返回执⾏结果的状态,没有执⾏完毕返回None>>> res = ("sleep 10;echo 'hello'",shell=True,stdout=,stderr=)>>> print(())None>>> print(())None>>> print(())05、wait()等待命令执⾏完成,并且返回结果状态>>> obj = ("sleep 10;echo 'hello'",shell=True,stdout=,stderr=)>>> ()# 中间会⼀直等待06、terminate()结束进程import subprocess>>> res = ("sleep 20;echo 'hello'",shell=True,stdout=,stderr=)>>> ate() # 结束进程>>> ()b''7、pid获取当前执⾏⼦shell的程序的进程号import subprocess>>> res = ("sleep 5;echo 'hello'",shell=True,stdout=,stderr=)>>> # 获取这个linux shell 的 进程号2778更多关于Python相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家Python程序设计有所帮助。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1688987228a191940.html
评论列表(0条)