Subprocess干嘛用的?

subprocess模块是python从2.4版本开始引入的模块。主要用来取代 一些旧的模块方法,如os.system、os.spawn*、os.popen*、commands.*等。subprocess通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息。

也就是说subprocess就是OS模块的升级版。

subprocess模块中的常用函数

函数 描述
subprocess.run() Python 3.5中新增的函数。执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。
subprocess.call() 执行指定的命令,返回命令执行状态,其功能类似于os.system(cmd)。
subprocess.check_call() Python 2.5中新增的函数。 执行指定的命令,如果执行成功则返回状态码,否则抛出异常。其功能等价于subprocess.run(..., check=True)。
subprocess.check_output() Python 2.7中新增的的函数。执行指定的命令,如果执行状态码为0则返回命令执行结果,否则抛出异常。
subprocess.getoutput(cmd) 接收字符串格式的命令,执行命令并返回执行结果,其功能类似于os.popen(cmd).read()和commands.getoutput(cmd)。
subprocess.getstatusoutput(cmd) 执行cmd命令,返回一个元组(命令执行状态, 命令执行结果输出),其功能类似于commands.getstatusoutput()。

1.subprocess.call


父进程等待子进程执行命令,返回子进程执行命令的状态码,如果出现错误,不进行报错

第二个参数默认为False,Flase参数为的时候命令需要通过列表的方式传入,为True的时候可以直接传入命令。

【在Python的console界面中我们是能够看到命令结果的,只是获取不到。想获取执行的返回结果,请看check_output。】

【不进行报错解释:如果我们执行的命令在执行时,操作系统不识别,系统会返回一个错误,如:abc命令不存在,这个结果会在console界面中显示出来,但是我们的Python解释器不会提示任何信息,如果想让Python解释器也进行报错,请看check_call】

>>> import subprocess
>>> obj = subprocess.call(['df','-h'],shell=False)
文件系统 容量 已用 可用 已用% 挂载点
udev 5.8G 0 5.8G 0% /dev
tmpfs 1.2G 1.8M 1.2G 1% /run
/dev/sda6 393G 137G 237G 37% /
tmpfs 5.8G 51M 5.8G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 5.8G 0 5.8G 0% /sys/fs/cgroup
tmpfs 1.2G 48K 1.2G 1% /run/user/1000
/dev/sda5 412G 26G 386G 7% /media/i3ekr/软件
/dev/sda1 121G 24G 97G 20% /media/i3ekr/F6AE5B1CAE5AD529
>>> obj = subprocess.call(('df -h'),shell=True)
文件系统 容量 已用 可用 已用% 挂载点
udev 5.8G 0 5.8G 0% /dev
tmpfs 1.2G 1.8M 1.2G 1% /run
/dev/sda6 393G 137G 237G 37% /
tmpfs 5.8G 49M 5.8G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 5.8G 0 5.8G 0% /sys/fs/cgroup
tmpfs 1.2G 48K 1.2G 1% /run/user/1000
/dev/sda5 412G 26G 386G 7% /media/i3ekr/软件
/dev/sda1 121G 24G 97G 20% /media/i3ekr/F6AE5B1CAE5AD529
注:shell=True参数会让subprocess.Popen接受字符串类型的变量作为命令,并调用shell去执行这个字符串.见而言之就是将输入的参数调用shell去执行,如果不调用那可能就会出现命令找不到的情况.
当shell=False是,subprocess.Popen只接受数组变量作为命令,并将数组的第一个元素作为命令,剩下的全部作为该命令的参数。 默认情况下为false.

2.subprocess.check_call()


用法和call作用一样,和call的区别是返回值不为0(也就是命令不正确)的时候直接抛出异常。

>>> obj = subprocess.check_call('qwe',shell=False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 181, in check_call
retcode = call(*popenargs, **kwargs)
File "/usr/lib/python2.7/subprocess.py", line 168, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 390, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1025, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
>>> obj = subprocess.check_call('df',shell=False)
文件系统 1K-块 已用 可用 已用% 挂载点
udev 6013400 0 6013400 0% /dev
tmpfs 1208056 1836 1206220 1% /run
/dev/sda6 411798952 143162248 247648800 37% /
tmpfs 6040264 48768 5991496 1% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 6040264 0 6040264 0% /sys/fs/cgroup
tmpfs 1208052 48 1208004 1% /run/user/1000
/dev/sda5 431498236 27213864 404284372 7% /media/i3ekr/软件
/dev/sda1 125830140 24482072 101348068 20% /media/i3ekr/F6AE5B1CAE5AD529

可以用来判断用户命令是否出错可以搭配try来使用。

3.subprocess.Popen()


在一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。在另一些场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令等。这个时候我们就需要使用到suprocess的Popen()方法。该方法有以下参数:

args:shell命令,可以是字符串,或者序列类型,如list,tuple。

bufsize:缓冲区大小,可不用关心

stdin,stdout,stderr:分别表示程序的标准输入,标准输出及标准错误

shell:与上面方法中用法相同

cwd:用于设置子进程的当前目录

env:用于指定子进程的环境变量。如果env=None,则默认从父进程继承环境变量

universal_newlines:不同系统的的换行符不同,当该参数设定为true时,则表示使用\n作为换行符

4.获取命令执行后返回的结果:

>>> import subprocess
>>> com = subprocess.Popen('ifconfig',stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> data = com.stdout.read()
>>> data
'enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500\n inet 10.41.8.24 netmask 255.255.252.0 broadcast 10.41.11.255\n inet6 fe80::a993:220a:2a:a488 prefixlen 64 scopeid 0x20<link>\n ether 98:40:bb:20:25:b0 txqueuelen 1000 (Ethernet)\n RX packets 7041415 bytes 6473395772 (6.0 GiB)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 6470453 bytes 3937057528 (3.6 GiB)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n\nlo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536\n inet 127.0.0.1 netmask 255.0.0.0\n inet6 ::1 prefixlen 128 scopeid 0x10<host>\n loop txqueuelen 1000 (Local Loopback)\n RX packets 775007 bytes 96639605 (92.1 MiB)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 775007 bytes 96639605 (92.1 MiB)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n\nvmnet1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500\n inet 172.16.189.1 netmask 255.255.255.0 broadcast 172.16.189.255\n inet6 fe80::250:56ff:fec0:1 prefixlen 64 scopeid 0x20<link>\n ether 00:50:56:c0:00:01 txqueuelen 1000 (Ethernet)\n RX packets 0 bytes 0 (0.0 B)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 1930 bytes 0 (0.0 B)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n\nvmnet8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500\n inet 172.16.150.1 netmask 255.255.255.0 broadcast 172.16.150.255\n inet6 fe80::250:56ff:fec0:8 prefixlen 64 scopeid 0x20<link>\n ether 00:50:56:c0:00:08 txqueuelen 1000 (Ethernet)\n RX packets 0 bytes 0 (0.0 B)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 1923 bytes 0 (0.0 B)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n\nwlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500\n inet 10.42.0.1 netmask 255.255.255.0 broadcast 10.42.0.255\n inet6 fe80::3e8b:4ca8:230f:4f1e prefixlen 64 scopeid 0x20<link>\n ether 70:1c:e7:25:e8:47 txqueuelen 1000 (Ethernet)\n RX packets 394488 bytes 27416908 (26.1 MiB)\n RX errors 0 dropped 3 overruns 0 frame 0\n TX packets 805283 bytes 1207252086 (1.1 GiB)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n\n'

Python中的subprocess模块的更多相关文章

  1. Python中使用subprocess模块远程执行命令

    使用subprocess模块执行远程命令 服务端代码 1 import socket 2 import subprocess 3 4 sh_server = socket.socket() 5 sh_ ...

  2. python笔记之subprocess模块

    python笔记之subprocess模块 [TOC] 从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system.os.spaw ...

  3. python中的subprocess.Popen()使用

    python中的subprocess.Popen()使用 从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回 ...

  4. Python中使用os模块执行远程命令

    1. 使用os模块远程执行命令 服务端代码 1 import socket 2 import os 3 4 sh_server = socket.socket() #创建一个socket对象 5 sh ...

  5. python中的subprocess.Popen()使用详解---以及注意的问题(死锁)

    从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值. subprocess意在替代其他几个老的模块或者函数 ...

  6. Python中的random模块,来自于Capricorn的实验室

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...

  7. Python中的logging模块

    http://python.jobbole.com/86887/ 最近修改了项目里的logging相关功能,用到了python标准库里的logging模块,在此做一些记录.主要是从官方文档和stack ...

  8. Python中的random模块

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...

  9. 浅析Python中的struct模块

    最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概了解了,在这里做一下简单的总结. 了解c语言 ...

随机推荐

  1. 错误 10 非静态的字段、方法或属性“Test10.Program.a”要求对象引用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test ...

  2. HTML5拖拽表格中单元格间的数据库

    效果图:

  3. 注解失效,@SpringBootApplication 失效,引入包失效

    因为同时修改两个springboot工程,其中把一个工程的版本调整到2.0.2.RELEASE,然后坑爹的事情出现了,所有springboot工程的@SpringBootApplication失效, ...

  4. 算法训练 Bus Tour

    问题描述 想象你是一个在Warsaw的游客,而且预订了一次乘车旅行,去城镇外看一些令人惊异的景点.这辆公共汽车首先围绕城镇行驶一段时间(一段很长的时间,由于Warsaw是一个大城市),把在各自旅馆的人 ...

  5. 【刷题】BZOJ 1143 [CTSC2008]祭祀river

    Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成 ...

  6. [洛谷P1714]切蛋糕

    题目大意:给你n个整数,求出其中长度不超过m的最大字段和. 题解:单调队列维护前缀和最小值,然后用当前值减去当前有效最小值即可 C++ Code: #include<cstdio> usi ...

  7. BZOJ4898 & BZOJ5367 & 洛谷3778:[APIO2017]商旅——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4898 https://www.lydsy.com/JudgeOnline/problem.php? ...

  8. BZOJ3894:文理分科——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3894 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理 ...

  9. POJ.2387 Til the Cows Come Home (SPFA)

    POJ.2387 Til the Cows Come Home (SPFA) 题意分析 首先给出T和N,T代表边的数量,N代表图中点的数量 图中边是双向边,并不清楚是否有重边,我按有重边写的. 直接跑 ...

  10. UVA.11384 Help is needed for Dexter (思维题)

    UVA.11384 Help is needed for Dexter (思维题) 题意分析 同样水题一道,这回思路对了. 给出数字n,面对一个1,2,3,4--n的数字序列,你可以对他们的部分或者全 ...