Python subprocess Popen

时间:2023-03-08 17:49:39
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"