• Subprocess模块


    Subprocess模块

    • 参数介绍:

      args: 启动进程的参数,默认为字符串序列(列表or元组),也可以为字符串,默认为字符串时一般需将shell参数赋值为True
      shell:当为True,表示args命令通过shell执行
      check:当为True,表示执行命令进程以非0状态码退出会抛出异常
      stdout,stdin,stderr:分别表示程序标准输出,输入,错误信息
      run函数返回值为CompletedProcess类,若需获取执行结果,可通过获取返回值的stdout和stderr来捕获;
      check_output函数若需捕获错误信息,可通过stderr=subprocess.STDOUT来获取;
      

    1.subprocess.run

    import subprocess
    res = subprocess.run(['ls','-l']) #直接将执行结果打印在屏幕上
    """
    total 8
    drwxr-xr-x 3 root root 4096 Feb 27 06:04 etc
    -rw-r--r-- 1 root root  466 Feb 23 00:01 supervisord.log
    """
    # res 为一个 CompletedProcess对象
    """
    # 如果returncode=0表示执行成功,returncode为1表示语法不正确,若执行命令不存在,会报FileNotFoundError错误:
    CompletedProcess(args=['ls', '-l'], returncode=0)
    """
    # 指定shell = True, check = True
    res2 = subprocess.run(['ls','-l'],shell=True,check=True)
    """
    只会打印文件信息:
    etc  supervisord.log
    """
    # 将执行完结果输出到对象上,默认stdout参数为None
    res3 = subprocess.run(['ls','-l'],shell=True,check=True,stdout=subprocess.PIPE)
    print(res3.stdout)
    """
    b'etc
    supervisord.log
    '
    """
    # 通过res3.stdout.decode("utf-8") #转换成字符串
    
    

    2.subprocess.call

    • 执行命令,返回值为命令执行状态码,若执行成功,则函数返回值为0,若执行失败,则函数返回值1:
    res = subprocess.call(['ls', '-l'])
    """
    total 8
    drwxr-xr-x 3 root root 4096 Feb 27 06:04 etc
    -rw-r--r-- 1 root root    0 Mar  2 21:07 subprocess_result.txt
    -rw-r--r-- 1 root root  466 Feb 23 00:01 supervisord.log
    >>> res
    0
    """
    

    3.subprocess. check_call

    • 执行args命令,返回命令执行状态,若未指定stdout,则命令执行后的结果输出到屏幕。若指定stdout,则命令执行后结果输出到stdout,若执行成功,则返回值为0,若执行失败,阿婆出异常。
    >>> r = subprocess.check_call(['ls','-l'],stdout=subprocess.PIPE)
    >>> r
    0
    
    

    4. subprocess.check_output

    • 执行args命令,返回值为命令执行的输出结果;若执行成功,则函数返回值为命令输出结果;若执行失败,则抛出异常。与subprocess.run相似

    5.subprocess的getoutput,getstatusoutput函数

    • getoutput:执行cmd命令,返回值为命令执行的输出结果(字符串类型)。注意:执行失败不会抛出异常。

    • getstatusoutput : 执行cmd命令,返回值为元组类型(命令执行状态, 命令执行的输出结果) ,元组中命令执行状态为0,表示执行成功;命令执行状态为1,表示执行失败;

    >>> res = subprocess.getoutput("pwd")
    >>> res
    '/root'
    >>> res = subprocess.getstatusoutput("pwd")
    >>> res
    (0, '/root')
    

    6.subprocess.Popen

    • subprocess.Popen类用于在一个新进程中执行一个子进程,上述subprocess函数均是基于subprocess.Popen类;

      args:需要执行的系统命令,可为字符串序列(列表或元组,shell为默认值False即可,建议为序列),也可为字符串(使用字符串时,需将shell赋值为True);
      shell:默认为False,若args为序列时,shell=False;若args为字符串时,shell=True,表示通过shell执行命令;
      stdout、stdin、stderr:分别表示子程序标准输出、标准输入、标准错误,可为subprocess.PIPE、一个有效的文件描述符、文件对象或None。
      若为subprocess.PIPE:代表打开通向标准流的管道,创建一个新的管道;
      若为None:表示没有任何重定向,子进程会继承父进程;
      stderr也可为subprocess.STDOUT:表示将子程序的标准错误输出重定向到了标准输出
      bufsize:指定缓冲策略,0表示不缓冲,1表示行缓冲,其它整数表示缓冲区大小,负数表示使用系统默认值0;
      cwd:默认值为None;若非None,则表示将会在执行这个子进程之前改变当前工作目录;
      env:用于指定子进程的环境变量。若env为None,那么子进程的环境变量将从父进程中继承;若env非None,则表示子程序的环境变量由env值来设置,它的值必须是一个映射对象。
      universal_newlines: 不同系统的换行符不同。若True,则该文件对象的stdin,stdout和stderr将会以文本流方式打开;否则以二进制流方式打开。
      
      
    • subprocess.Popen对象常用方法

      
      
    • 小demo

      import subprocess
      def subprocess_Popen2():
          print("***通过管道方式***")
          p1 = subprocess.Popen(["ps", "-ef"], stdout=subprocess.PIPE)
          # 将第一个进程执行结果传入p2 stdin中。
          p2 = subprocess.Popen(["grep", "nginx"], stdin=p1.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
          # communicate与进程进行交互,它会阻塞父进程,知道子进程完成。
          # communicate返回值:一个元组(stdout_data, stderr_data) 输出信息,错误信息
          out, err = p2.communicate()
          print(out, err)
      
      subprocess_Popen2()
      
      def subprocess_Popen3():
          p3 = subprocess.Popen("ps -ef | grep nginx", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
          out, err = p3.communicate()
          print(out, err)
      subprocess_Popen3()
      
      def subprocess_Popen1():
          # universal_newlines参数为True,则此流是一个文件流,否则为字节流。
          p4 = subprocess.Popen(["python"], stdout=subprocess.PIPE,
                                stdin=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
          p4.stdin.write("print('hello')")
          output = p4.communicate()
          print(output)
      
      >>> res = subprocess.Popen("ls -l",shell=True,stdout=subprocess.PIPE)
      # 得到一个列表
      >>> res.stdout.readlines()
      """
      [b'total 12
      ', b'-rw-r--r-- 1 root root 1056 Mar  2 22:28 res.py
      ', b'drwx------ 3 root root 4096 Feb 18 12:02 systemd-private-ac203fc6108b467f9d8e665c5143a497-chronyd.service-QKihw9
      ', b'drwx------ 3 root root 4096 Feb 22 23:54 systemd-private-ac203fc6108b467f9d8e665c5143a497-mariadb.service-LMimCP
      ']
      """
      >>> res.poll() #检查命令是否执行结束,若结束返回状态码,若未结束返回None
      >>> res.wait() #等待子进程结束,并返回状态码。若超时进程仍未结束,则抛出异常
      
    • 转载: https://www.jianshu.com/p/430c411160f8

  • 相关阅读:
    prototype.js超强的javascript类库
    MySQL Server Architecture
    Know more about RBA redo block address
    MySQL无处不在
    利用Oracle Enterprise Manager Cloud Control 12c创建DataGuard Standby
    LAMP Stack
    9i中DG remote archive可能导致Primary Database挂起
    Oracle数据库升级与补丁
    Oracle为何会发生归档日志archivelog大小远小于联机重做日志online redo log size的情况?
    Oracle Ksplice如何工作?How does Ksplice work?
  • 原文地址:https://www.cnblogs.com/xujunkai/p/12398600.html
Copyright © 2020-2023  润新知