python 入坑路--subprocess 模块
简介
该模块用于,python跟操作系统之间做交换,直白一点就是python执行操作系统的一些命令,得到一些返回结果。
之前使用的 os.system() ,os.popen(), python2.7 使用的是 commands ,commands 只支持在linux 系统,windows 会有问题。
下面几个简单的例子看看 ,这些命令怎么用
>>> import os #导入模块
>>> os.system("dir")
驱动器 C 中的卷没有标签。
卷的序列号是 96FA-C591
C:\Users\kchendw 的目录
2017/09/30 13:55 <DIR> .
2017/09/30 13:55 <DIR> ..
2017/09/30 14:03 <DIR> .idlerc
2017/04/24 09:13 360 .packettracer
2017/07/11 16:38 <DIR> .PyCharm2017.1
2017/01/10 09:17 <DIR> .VirtualBox
2016/07/15 08:57 21,493 bgxs.txt
2017/04/21 16:57 <DIR> Cisco Packet Tracer 6.2sv
2017/04/13 13:40 <DIR> Cisco Packet Tracer 7.0
import os
res =os.system("dir")
res
0 #代表执行成功,如果不成功就是其它,不一定是1 ,
上面的例子只实现 执行命令,及屏幕显示执行命令的结果,那怎么把执行结果的内容返回呢,我们需要用到另一个命令 os.popen()
1 res=os.popen("dir").read()
2
3 print(res) #返回执行内容
下面我们来看看subprocess 模块
>>> import subprocess
>>> subprocess.run("pwd")
/usr/bin
CompletedProcess(args='pwd', returncode=0)
#如果带有管道命令,等复杂的命令,需要调用 操作系统的shell 直接执行
>>> subprocess(["df","-h"]) #第一种,比较简单的命令,以类别形式让python 去解析,返回执行结果。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
>>> subprocess.run(["df","-h"])
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 50G 2.0G 49G 4% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 57M 1.8G 3% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sda1 1014M 130M 885M 13% /boot
/dev/sda7 10G 33M 10G 1% /archive
/dev/sda6 30G 292M 30G 1% /var
/dev/sda3 10G 569M 9.5G 6% /home
/dev/mapper/vg1-lv1 1014M 33M 982M 4% /mnt/lv1
tmpfs 379M 0 379M 0% /run/user/0
tmpfs 379M 0 379M 0% /run/user/1000
CompletedProcess(args=['df', '-h'], returncode=0)
>>> subprocess.run("df -h | grep sha2",shell=True) #比较复杂命令,调用shell ,让shell解析命令,返回执行状态
CompletedProcess(args='df -h | grep sha2', returncode=1)
>>>
python 3.5 以前的一些其它命令
import subprocess
>>> res=subprocess.call(["cd","/"]) #call 命令,类似 os.system()
>>> res
0
>>> res=subprocess.check_call(["cd","/"]) #查看命令是否可以执行,
>>>res
0 # 0,可以 ,不可以抛异常 如下
>>> res=subprocess.check_call(["cd","\"])
File "<stdin>", line 1
res=subprocess.check_call(["cd","\"])
^
SyntaxError: EOL while scanning string literal
#以元祖形式返回执行状态及结果
>>>res=subprocess.getstatusoutput(['df','h'])
>>> print(res[1])
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 52403200 2052948 50350252 4% /
devtmpfs 1927512 0 1927512 0% /dev
tmpfs 1937068 0 1937068 0% /dev/shm
tmpfs 1937068 57736 1879332 3% /run
tmpfs 1937068 0 1937068 0% /sys/fs/cgroup
/dev/sda1 1038336 132948 905388 13% /boot
/dev/sda7 10475520 32992 10442528 1% /archive
/dev/sda6 31441920 297988 31143932 1% /var
/dev/sda3 10475520 581772 9893748 6% /home
/dev/mapper/vg1-lv1 1038336 32992 1005344 4% /mnt/lv1
tmpfs 387416 0 387416 0% /run/user/0
tmpfs 387416 0 387416 0% /run/user/1000
>>> print(res[0])
0
>>>
# 接受命令返回结果,结果是bytes 格式
>>> res=subprocess.check_output(['df','-h'])
>>> res
b'\xe6\x96\x87\xe4\xbb\xb6\xe7\xb3\xbb\xe7\xbb\x9f
\xe5\xae\xb9\xe9\x87\x8f \xe5\xb7\xb2\xe7\x94\xa8
\xe5\x8f\xaf\xe7\x94\xa8 \xe5\xb7\xb2\xe7\x94\xa8%
\xe6\x8c\x82\xe8\xbd\xbd\xe7\x82\xb9\n/dev/sda2
50G 2.0G 49G 4% /\ndevtmpfs
1.9G 0 1.9G 0% /dev\ntmpfs
1.9G 0 1.9G 0% /dev/shm\ntmpfs
1.9G 57M 1.8G 3% /run\ntmpfs
1.9G 0 1.9G 0% /sys/fs/cgroup\n/dev/sda1
1014M 130M 885M 13% /boot\n/dev/sda7
10G 33M 10G 1% /archive\n/dev/sda6
30G 292M 30G 1% /var\n/dev/sda3
10G 569M 9.5G 6% /home\n/dev/mapper/vg1-lv1 1014M
33M 982M 4% /mnt/lv1\ntmpfs
379M 0 379M 0% /run/user/0\ntmpfs
379M 0 379M 0% /run/user/1000\n'
以上这些命令,底层都是 subprocess.popen 封装的,下面让我们来玩一玩 这个命令
>>> res =subprocess.Popen("df -h | grep sda2",shell=True,stdout=subprocess.PIPE)
>>> res.stdout.read()
b'/dev/sda2 50G 2.0G 49G 4% /\n'
大概的一个流程如下。


浙公网安备 33010602011771号