目的:顺序执行进程 在Bash里面类似 a.sh && b.sh && c.sh
先来说下Popen这个函数
class 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)
- args 子进程cmd
- bufsize 默认是20K
- stdin 标准输入
- stdout 标准输出
- stderr 标准错误
- 其他参数略过。。。。。
- 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 sysdef 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"