• 学习subprocess模块...


    学习subprocess.Popen模块

    调用subprocess.run(...)是推荐的常用方法,在大多数情况下能满足需求,但如果你可能需要进行一些复杂的与系统的交互的话,你还可以用subprocess.Popen(),语法如下:

    p = subprocess.Popen("find / -size +1000000 -exec ls -shl {} ;",shell=True,stdout=subprocess.PIPE)
    print(p.stdout.read())

    可用参数:

    args:shell命令,可以是字符串或者序列类型(如:list,元组)
    bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
    stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
    preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
    close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
    所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
    shell:同上
    cwd:用于设置子进程的当前目录
    env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
    universal_newlines:不同系统的换行符不同,True -> 同意使用
    startupinfo与createionflags只在windows下有效
    将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等
    终端输入的命令分为两种:

    输入即可得到输出,如:ifconfig
    输入进行某环境,依赖再输入,如:python

    如:
    
    import subprocess
     
    obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    obj.stdin.write('print 1 
     ')
    obj.stdin.write('print 2 
     ')
    obj.stdin.write('print 3 
     ')
    obj.stdin.write('print 4 
     ')
     
    out_error_list = obj.communicate(timeout=10)
    print out_error_list
    

    subprocess实现sudo 自动输入密码

    import subprocess
     
    def mypass():
        mypass = '123' #or get the password from anywhere
        return mypass
     
    echo = subprocess.Popen(['echo',mypass()],
                            stdout=subprocess.PIPE,
                            )
     
    sudo = subprocess.Popen(['sudo','-S','iptables','-L'],
                            stdin=echo.stdout,
                            stdout=subprocess.PIPE,
                            )
     
    end_of_pipe = sudo.stdout
     
    print "Password ok 
     Iptables Chains %s" % end_of_pipe.read()
    

    1 #Popen它的构造函数如下:
    2 subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None,stderr=None, preexec_fn=None, close_fds=False, shell=False,cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
    3 # 参数args可以是字符串或者序列类型(如:list,元组),用于指定进程的可执行文件及其参数。
    4 # 如果是序列类型,第一个元素通常是可执行文件的路径。我们也可以显式的使用executeable参
    5 # 数来指定可执行文件的路径。在windows操作系统上,Popen通过调用CreateProcess()来创
    6 # 建子进程,CreateProcess接收一个字符串参数,如果args是序列类型,系统将会通过
    7 # list2cmdline()函数将序列类型转换为字符串。
    8 # 参数bufsize:指定缓冲。我到现在还不清楚这个参数的具体含义,望各个大牛指点。
    9 # 参数executable用于指定可执行程序。一般情况下我们通过args参数来设置所要运行的程序。如
    10 # 果将参数shell设为True,executable将指定程序使用的shell。在windows平台下,默认的
    11 # shell由COMSPEC环境变量来指定。
    12 # 参数stdin, stdout, stderr分别表示程序的标准输入、输出、错误句柄。他们可以是PIPE,
    13 # 文件描述符或文件对象,也可以设置为None,表示从父进程继承。
    14 #
    15 # 参数preexec_fn只在Unix平台下有效,用于指定一个可执行对象#(callable object),它将在子进程运行之前被调用。
    16 # 参数Close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会
    17 # 继承父进程的输入、输出、错误管道。我们不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
    18 # 如果参数shell设为true,程序将通过shell来执行。
    19 # 参数cwd用于设置子进程的当前目录。
    20 # 参数env是字典类型,用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
    21 # 参数Universal_newlines:不同操作系统下,文本的换行符是不一样的。如:windows下
    22 # 用’/r/n’表示换,而Linux下用’/n’。如果将此参数设置为True,Python统一把这些换行符当
    23 # 作’/n’来处理。
    24 # 参数startupinfo与createionflags只在windows下用效,它们将被传递给底层的
    25 # CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等。

  • 相关阅读:
    20155208徐子涵 2016-2017-2 《Java程序设计》第8周学习总结
    20155208徐子涵 2016-2017-2 《Java程序设计》第7周学习总结
    20155208徐子涵 2016-2017-2 《Java程序设计》第6周学习总结
    20155208徐子涵 2016-2017-2 《Java程序设计》第5周学习总结
    20155208徐子涵 2016-2017-2 《Java程序设计》第4周学习总结
    20155208徐子涵 2016-2017-2 《Java程序设计》第3周学习总结
    20155208徐子涵 2016-2017-2 《Java程序设计》第2周学习总结
    20155207 2016-2017-2 《Java程序设计》第十周学习总结
    20155207 2016-2017-2 《Java程序设计》第九周学习总结
    20155207 2016-2017-2 《Java程序设计》第八周学习总结
  • 原文地址:https://www.cnblogs.com/shiqi17/p/9801052.html
Copyright © 2020-2023  润新知