• Python subprocess Popen


    目的:顺序执行进程  在Bash里面类似  a.sh && b.sh && c.sh

     

    先来说下Popen这个函数

    class subprocess.Popen(argsbufsize=0executable=Nonestdin=Nonestdout=Nonestderr=Nonepreexec_fn=Noneclose_fds=False

            shell=Falsecwd=Noneenv=Noneuniversal_newlines=Falsestartupinfo=None,creationflags=0)

    1. args 子进程cmd
    2. bufsize  默认是20K
    3. stdin  标准输入
    4. stdout 标准输出
    5. stderr 标准错误
    6. 其他参数略过。。。。。

     

    • Popen.poll() 检查子进程是否终止,返回returncode
    • Popen.wait()等待子进程终止,返回returncode,需要注意的是,如果 Popen 执行命令的时候,设置stdout=PIPE 或者 stderr=PIPE,子进程将会产生足够多的输出,这将会造成OS的管道缓存来不及接受数据而拥堵,这个时候需要用communicate() 这个函数。
    • Popen.communicate(input=None) 这个是和进程交互的一个方法,可以发送数据给子进程的标准输入直到进程结束。如果不要求传输数据给子进程设置input=None

    communicate() 返回 tuple (stdoutdata, stderrdata).

    如果你想发送数据给子进程的标准输入, 你需要在创建 Popen的时候设置 stdin=PIPE. 如果你想获得Tuple里面的信息,你就得设置stdout=PIPE 或者/和 stderr=PIPE.

    这个方法的数据读取之后是缓存在内存的,如果数据量很大不推荐用这个方法

     

    例子:

    import subprocess
    import os
    import sys

    def run_application(command):
      try:
        process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        communicate = process.communicate(input=None)
        return communicate
      except Exception:
        print "error"
        sys.exit(-1)

    if __name__ == "__main__":
      cmd = "ls"

      result = run_application(cmd)
      if result[0]:
      run_application(cmd)
      print "done"

     

     

  • 相关阅读:
    u-boot 用哪个lds链接脚本
    u-boot-2019.07 移植步骤
    u-boot-2016.09 make编译过程分析(二)
    grep 命令搜索 带空格的字符
    uboot if_changed函数
    2019保险规划 待完善
    MongoDB Capped集合
    并发编程——详解 AQS CLH 锁
    Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
    观察者模式
  • 原文地址:https://www.cnblogs.com/hugeshi/p/4075828.html
Copyright © 2020-2023  润新知