zoukankan      html  css  js  c++  java
  • python之commands和subprocess入门介绍(可执行shell命令的模块)

    一、commands模块

    1、介绍

    当我们使用Python进行编码的时候,但是又想运行一些shell命令,去创建文件夹、移动文件等等操作时,我们可以使用一些Python库去执行shell命令。

    commands模块就是其中的一个可执行shell命令的库,commands模块是python的内置模块,共有三个函数:

    1. getstatus(file):返回执行 ls -ld file 命令的结果( -ld 代表的是仅列出指定目录的详细信息)。
    2. getoutput(cmd):执行cmd命令,并返回输出的内容,返回结果为str。
    3. getstatusoutput(cmd):执行cmd命令,并返回执行的状态(status)和输出的内容(output),status代表的shell命令的返回状态,如果成功的话是0,output是shell的返回的结果。

    注意:

    commands从2.6版开始不推荐使用:模块已在Python 3中删除。推荐使用subprocess模块(等下再介绍)。

    在3.x版本中,getstatus()方法被移除,getoutput()和getstatusoutput()被放到了subprocess模块中。

    2、getstatus(file)

    返回执行 ls -ld file 命令的结果( -ld 代表的是仅列出指定目录的详细信息)。

    # -*- coding: utf-8 -*-
    import commands
    status = commands.getstatus("/opt")  # 即执行了:ls -ld /opt
    print status
    
    
    # 结果
    drwxr-xr-x. 9 root root 4096 2019/11/11 16:49:40 /opt

    3、getoutput(cmd)

    执行cmd命令,并返回输出的内容,返回结果为str。

    # -*- coding: utf-8 -*-
    import commands
    output = commands.getoutput("ls -l /opt")
    print output
    
    
    # 结果
    总用量 28
    drwx--x--x  4 root root 4096 2019/11/11 16:49:40 containerd
    drwxr-xr-x 13 root root 4096 2019/01/15 14:48:15 nginx1.12
    drwxrwxr-x  7  500  500 4096 2019/01/14 10:30:05 node-v8.6.0-linux-x64
    drwxr-xr-x  7 root root 4096 2019/09/17 09:31:24 Projects
    drwxr-xr-x  6 root root 4096 2019/01/10 19:17:30 python36
    drwxrwxr-x  8 root root 4096 2019/09/16 20:00:52 redis-4.0.10
    drwxr-xr-x  6 root root 4096 2019/01/16 17:47:34 ruby

    4、getstatusoutput(cmd)

     执行cmd命令,并返回执行的状态(status)和输出的内容(output),status代表的shell命令的返回状态,如果成功的话是0,output是shell的返回的结果。

    # -*- coding: utf-8 -*-
    import commands
    status, output = commands.getstatusoutput("ls -l /opt")
    print "status: %s" % status
    print "output: %s" % output
    
    
    # 结果
    status: 0
    output: 总用量 28
    drwx--x--x  4 root root 4096 2019/11/11 16:49:40 containerd
    drwxr-xr-x 13 root root 4096 2019/01/15 14:48:15 nginx1.12
    drwxrwxr-x  7  500  500 4096 2019/01/14 10:30:05 node-v8.6.0-linux-x64
    drwxr-xr-x  7 root root 4096 2019/09/17 09:31:24 Projects
    drwxr-xr-x  6 root root 4096 2019/01/10 19:17:30 python36
    drwxrwxr-x  8 root root 4096 2019/09/16 20:00:52 redis-4.0.10
    drwxr-xr-x  6 root root 4096 2019/01/16 17:47:34 ruby

     二、subprocess模块

    1、介绍

    subprocess模块允许你启动一个新的进程,连接输入/输出/错误的管道, 获得子进程的返回码。这个模块目标是代替一些老的模块,比如os.system和os.spawn。

    subprocess模块中的常用函数

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

    2、getoutput,getstatusoutput

    上面我们说了,commands在3.x版本中,getstatus()方法被移除,getoutput()和getstatusoutput()被放到了subprocess模块中。

    因此subprocess中的getoutput,getstatusoutput用法与commands的用法一模一样。

    # -*- coding: utf-8 -*-
    import subprocess
    output = subprocess.getoutput("pwd")
    print("output1: %s" % output)
    
    status, output = subprocess.getstatusoutput("pwd")
    print("status2: %s" % status)
    print("output2: %s" % output)
    
    
    # 结果
    output1: /tmp
    
    status2: 0
    output2: /tmp

    3、subprocess.call()

    执行命令,返回状态码(命令正常执行返回0,其他状态码都是错误状态码)

    subprocess.call(cmd, shell=False) 当shell=False的时候(默认),cmd为一个列表,当shell=True的时候,cmd为一个字符串,例如:

    # -*- coding:utf-8 -*-
    import subprocess
    
    try:
        # shell=False
        ret1 = subprocess.call(["ls", "-l", "/opt"], shell=False)
        print("result1: %s" % ret1)
    
        # shell=True
        ret2 = subprocess.call("lxxs -l /tmp", shell=True)  # 当命令是错误的时候,返回的状态码就不是0了
        print("result2: %s" % ret2)
    except Exception as e:
        print(e)
    
    # 结果
    总用量 28
    drwx--x--x  4 root root 4096 2019/11/11 16:49:40 containerd
    drwxr-xr-x 13 root root 4096 2019/01/15 14:48:15 nginx1.12
    drwxrwxr-x  7  500  500 4096 2019/01/14 10:30:05 node-v8.6.0-linux-x64
    drwxr-xr-x  7 root root 4096 2019/09/17 09:31:24 Projects
    drwxr-xr-x  6 root root 4096 2019/01/10 19:17:30 python36
    drwxrwxr-x  8 root root 4096 2019/09/16 20:00:52 redis-4.0.10
    drwxr-xr-x  6 root root 4096 2019/01/16 17:47:34 ruby
    result1: 0
    
    /bin/sh: lxxs: 未找到命令
    result2: 127

    4、subprocess.check_call()

    执行命令,如果执行成功则返回状态码0,否则抛异常(subprocess.CalledProcessError)。

    其实check_call基本和call功能一样,只是增加了返回状态码校验,如果执行状态码是0,则返回0,否则抛出异常

    # -*- coding:utf-8 -*-
    import subprocess
    
    try:
        ret = subprocess.check_call("ls -l /opt", shell=True)
        print("result: %s" % ret)
    except subprocess.CalledProcessError as e:
        print(e)

    5、subprocess.check_output()

    执行命令,如果执行成功则返回执行结果,否则抛异常

    # -*- coding:utf-8 -*-
    import subprocess
    
    try:
        ret = subprocess.check_output("ls -l /opt", shell=True)
        print("result: %s" % ret)
    except subprocess.CalledProcessError as e:
        print(e)
    
    
    # 结果
    result: b'xe6x80xbbxe7x94xa8xe9x87x8f 28
    drwx--x--x  4 root root 4096 2019/11/11 16:49:40 containerd
    drwxr-xr-x 13 root root 4096 2019/01/15 14:48:15 nginx1.12
    drwxrwxr-x  7  500  500 4096 2019/01/14 10:30:05 node-v8.6.0-linux-x64
    drwxr-xr-x  7 root root 4096 2019/09/17 09:31:24 Projects
    drwxr-xr-x  6 root root 4096 2019/01/10 19:17:30 python36
    drwxrwxr-x  8 root root 4096 2019/09/16 20:00:52 redis-4.0.10
    drwxr-xr-x  6 root root 4096 2019/01/16 17:47:34 ruby
    '

    6、call、check_call、check_output的区别

    根据上面的结果,我们可知:

    • ret1 = subprocess.call(cmd):ret1是cmd命令执行后的状态码,cmd执行的结果会在终端显示出来,也就是说如果不需要判断命令的执行结果的状态码,直接subprocess.call(cmd)即可,不需要用一个变量去接收状态码。
    • ret2 = subprocess.check_call(cmd):跟call一样的,只是如果状态码是不是0,即命令执行失败的时候会抛出异常。
    • ret3 = subprocess.check_output(cmd): call和check_call的ret是cmd命令的状态码,cmd的执行结果是在终端显示的,而check_output的cmd执行结果不会显示在终端,而是保存在ret中。
  • 相关阅读:
    【转贴】SMP、NUMA、MPP体系结构介绍
    【转贴】内存重要参数详解 RAS CAS
    【转贴】内存系列二:深入理解硬件原理
    [百度]将ftp添加到本地映射磁盘的方法
    [百家号]7nm ARM 64核!华为Hi1620高性能CPU公开:3.0GHz
    CISCO系列交换机如何清空配置
    绝对实用 NAT + VLAN +ACL管理企业网络
    思科 vlan 相关操作
    思科路由器的密码忘记了用简单的命令来重置思科路由器密码
    字符串驱动技术—— MethodAddress , MethodName , ObjectInvoke
  • 原文地址:https://www.cnblogs.com/Zzbj/p/12129073.html
Copyright © 2011-2022 走看看