• py执行系统命令


    1. os.system

    In [32]: run = os.system("date")
    Thu Jan 28 09:41:25 CST 2016
    In [33]: run
    Out[33]: 0

    只能得到返回值,无法得到输出。

    2. os.popen

    In [35]: run = os.popen("date")
    In [36]: run.read
    Out[36]: <function read>
    In [37]: run.read()
    Out[37]: 'Thu Jan 28 09:43:14 CST 2016
    '

    只能得到输出,无法得到返回值。

    3. commands模块

    In [39]: run = commands.getstatusoutput("date")
    In [40]: run
    Out[40]: (0, 'Thu Jan 28 09:44:44 CST 2016')

    返回一个数组。

    4. subprocess模块

    4.1 call

    In [42]: run = subprocess.call(["uname","-a"], shell=True)
    Linux
    In [43]: run
    Out[43]: 0

    直接输出结果,将返回值赋值给变量,类似os.system

    4.2 Popen

    In [44]: run = subprocess.Popen("uname -a", shell=True,stdout=subprocess.PIPE)
    In [48]: run.stdout.read()
    Out[48]: 'Linux test-sun207 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
    '
    In [49]: run.wait()
    Out[49]: 0

    注意: 当执行命令的参数或者返回中包含了中文文字,那么建议使用subprocess,如果使用os.popen则会出现错误。

    5. sh模块

    安装:pip install sh

    In [62]: from sh import ifconfig
    In [63]: run = sh.ifconfig
    In [64]: run
    Out[64]: <Command '/usr/sbin/ifconfig'>
    In [65]: run()
    Out[65]: 
    ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.1.207  netmask 255.255.255.0  broadcast 192.168.1.255
            inet6 fe80::20c:29ff:fe71:888  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:71:08:88  txqueuelen 1000  (Ethernet)
            RX packets 95617464  bytes 8518940518 (7.9 GiB)
            RX errors 0  dropped 7078520  overruns 0  frame 0
            TX packets 1175268  bytes 172715015 (164.7 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 0  (Local Loopback)
            RX packets 191  bytes 58512 (57.1 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 191  bytes 58512 (57.1 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    In [67]: run.bake()
    Out[67]: <Command '/usr/sbin/ifconfig'>
    In [68]: run('lo')
    Out[68]: 
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 0  (Local Loopback)
            RX packets 191  bytes 58512 (57.1 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 191  bytes 58512 (57.1 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    执行脚本:

    import sh
    run = sh.Command("/home/amoffat/run.sh") # Absolute path
    run()

    多个参数:

    from sh import tar
    tar("cvf", "/tmp/test.tar", "/my/home/directory")

    关键字参数:

    # resolves to "curl http://duckduckgo.com/ -o page.html --silent"
    curl("http://duckduckgo.com/", o="page.html", silent=True)
    # or if you prefer not to use keyword arguments, this does the same thing:
    curl("http://duckduckgo.com/", "-o", "page.html", "--silent")
    # resolves to "adduser amoffat --system --shell=/bin/bash --no-create-home"
    adduser("amoffat", system=True, shell="/bin/bash", no_create_home=True)
    # or
    adduser("amoffat", "--system", "--shell", "/bin/bash", "--no-create-home")

    返回值:

    output = ls("/")
    print(output.exit_code) # should be 0
    #捕获异常:
    try: print(ls("/some/non-existant/folder"))
    except ErrorReturnCode_2:
        print("folder doesn't exist!")
        create_the_folder()
    except ErrorReturnCode:
        print("unknown error")
        exit(1)

    ###:

    In [92]: sh.ls(sh.glob('*.txt'))
    Out[92]: requirements.txt

    tail:

    In [93]: for line in sh.tail("-f", "requirements.txt", _iter=True):
       ....:     print line  #实现其他更好玩的功能
       ....:     
    requests==2.9.0
    six==1.10.0
    slip==0.4.0
    #callback实现:
    def process_output(line):
        print(line)
    p = tail("-f", "/var/log/some_log_file.log", _out=process_output)
    p.wait()


  • 相关阅读:
    nessus 安装
    firefox SSL_ERROR_RX_RECORD_TOO_LONG burpsuit 报错 解决方案
    Vmware 15 新建虚拟机黑屏
    esp8266 IOT Demo 固件刷写记录
    elk + suricata 实验环境详细安装教程
    停更申明
    求二叉树的深度
    方差
    链表的基本排序
    正态分布及3Sigma原理
  • 原文地址:https://www.cnblogs.com/bvac/p/5420209.html
Copyright © 2020-2023  润新知