• Python学习---重点模块之subprocess


    subprocess是用来执行系统程序,查看系统的模块,

    查看当前目录

    第一种方法:

    import subprocess
    # subprocess会单独自己开辟一个线程,内部是多线程
    # stdout=subprocess.PIPE 利用管道将输出的内容输出由子进程转换到主进程
    obj = subprocess.Popen('dir', shell=True, stdout=subprocess.PIPE)
    print(obj)         # <subprocess.Popen object at 0x00000000009A7B00>
    print(str(obj.stdout.read(), 'gbk'))   # 编码用GBK,默认在当前文件所在的文件路径

    image

    第二种更简单:

    import subprocess
    print(subprocess.getoutput('dir'))

    image

    第三种:利用os.system()

    import os
    print(os.system('dir'))

    执行某个脚本/命令

    # 方法一
    tracker_obj = subprocess.Popen("%s %s" % (session_tracker_script, md5_str), shell=True,
                                                               stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                                                               # 这个cwd命名式指定python运行的路径的
                                                               cwd=settings.BASE_DIR)
    # 方法二: 根Popen的区别是,run可以让程序在后台运行
    ssh_instance = subprocess.run(login_cmd, shell=True)

    subprocess的cwd的参数使用:
    >>> import subprocess
    >>> subprocess.run("pwd")
    /home/omc/CityHunter
    CompletedProcess(args='pwd', returncode=0)
    >>> subprocess.run("pwd", cwd="/tmp")
    /tmp
    CompletedProcess(args='pwd', returncode=0)
    

      

    
    

    Python下subprocess的交互

    1>Python下的交互之subprocess.Popen

    omc@omc-virtual-machine:~/sshpass-1.06$ python3
    Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>import subprocess
    >>>subprocess.Popen("sshpass -p FTL200@HHH ssh root@192.168.25.133 -o 'StrictHostKeyChecking no'", shell=True, stderr=subprocess.PIPE, stdin=subprocess.PIPE, stdout=subprocess.PIPE)       【远程交互】

    >>> subprocess.Popen("df -h", shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
    <subprocess.Popen object at 0x7f93b22d10f0>       【本机的命令执行】
    >>> Filesystem      Size  Used Avail Use% Mounted on
    udev            472M     0  472M   0% /dev
    tmpfs            99M  6.2M   93M   7% /run
    /dev/sda1        14G  4.9G  8.2G  38% /
    tmpfs           492M  188K  492M   1% /dev/shm
    tmpfs           5.0M  4.0K  5.0M   1% /run/lock
    tmpfs           492M     0  492M   0% /sys/fs/cgroup
    tmpfs            99M   28K   99M   1% /run/user/108
    tmpfs            99M     0   99M   0% /run/user/1000     
    从上可以看出,subprocess.Popen并不能实现远程机器的实时交互,所有的输出信息都输入到了管道里,需要手动去读取内容,此时就无法实现输入信息了,所以实时交互用subprocess.Popen不行;但却可以达到本机的命令解析的效果。

    2>Python下的交互之subprocess.run

    omc@omc-virtual-machine:~/sshpass-1.06$ python3
    Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import subprocess
    >>>subprocess.run("sshpass -p FTL200@HH ssh root@192.168.25.133 -o 'StrictHostKeyChecking no'", shell=True)
    Last login: Mon May  7 07:01:56 2018 from 192.168.25.110
    [root@localhost ~]# ifconfig|grep eth2
    eth2      Link encap:Ethernet  HWaddr 00:0C:29:E4:35:5D  

     

    总结一下:python直接切换Linux下的shell可以用Python下的subprocess的run()来实现实时的交互。【超牛逼】

  • 相关阅读:
    ajax跨域
    抽奖概率计算
    应用版本
    empty
    java线程池原理
    java队列
    jquery选择器项目实例分析
    jquery操作dom
    40款非常棒的 jQuery 插件和制作教程(系列一)
    vijosP1046 观光旅游(最小环)
  • 原文地址:https://www.cnblogs.com/ftl1012/p/subprocess.html
Copyright © 2020-2023  润新知