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'  

大概的一个流程如下。  

 

posted @ 2018-01-30 13:37  东郭仔  阅读(292)  评论(0)    收藏  举报