实践:subprocess使用
stevezhou 2014.10.21
从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值。
subprocess意在替代其他几个老的模块或者函数,如:os.system os.spawn* os.popen* popen2.* commands.*
Popen的原型
class Popen( args, ------字符串或包含程序参数的列表。执行的程序是这个列表的第一项,或者是字符串本身。
bufsize=0, ------0 无缓冲,1行缓冲,正值:缓冲区大小,负值:系统默认缓冲(一般是全缓冲)
executable=None, ------args字符串或列表第一项表示程序名(一般不用)
stdin=None, ------None,无重定向,继承父进程; PIPE,创建管道;文件对象;文件描述符(整数);
stdout=None,
stderr=None,
preexec_fn=None, ------钩子函数,在fork和exec之间执行(UNIX)
close_fds=False, ------unix下执行新进程前是否关闭0/1/2之外的文件
shell=False, ----相当于args前面添加"/bin/sh " "-c" (unix) 或 "cmd.exe /c"(windows)
cwd=None, ------设置工作目录
env=None, ------设置环境变量
universal_newlines=False, ------各种换行符统一处理成 '\n'
startupinfo=None, ------window下,传递给CreateProcess的结构体
creationflags=0 ------windows下,传递CREATE_NEW_CONSOLE创建自己的控制台窗口
)
Pope对象的方法与属性
poll() | 检查子进程是否结束,设置返回值 |
wait() | 等待结束,设置返回值.慎用,当PIPE满但进程又在wait时,很容易出现死锁。建议用communicate. |
communicate() | 参数是标准输入,返回标准输出和标准出错 |
send_signal() | 发送信号(主要在unix下有用) |
terminate() | 终止进程,unix对应的SIGTERM信号,windows下调用api函数TerminateProcess( ) |
kill() | 杀死进程(unix对应SIGKILL信号),windows下同上 |
stdin stdout stderr |
参数中指定stdout哦PIPE时,有用 |
pid | 进程ID,如果shell=True,为子shell的进程ID |
returncode | 进程返回值 |
示例:查询'/var/'目录下的文件,
import subprocess as sp
varll=sp.Popen('ls /var/ -l',shell=True,close_fds=True,stdout=sp.PIPE,stderr=sp.PIPE)
out,err=varll.communicate() #返回一个元组,标准输出为元素1,标准错误为元素2
print out
print err
输出结果:
total 80
drwxr-xr-x. 2 root root 4096 Jun 10 10:14 account
drwxr-xr-x. 8 root root 4096 Jun 10 10:12 cache
drwxr-xr-x. 2 root root 4096 Nov 23 2013 crash
drwxr-xr-x. 2 root root 4096 Nov 22 2013 cvs
drwxr-xr-x. 4 root root 4096 Jun 10 10:14 db
drwxr-xr-x. 3 root root 4096 Jun 10 10:13 empty
drwxr-xr-x 3 root root 4096 Aug 4 18:35 ftp
drwxr-xr-x. 2 root root 4096 Sep 23 2011 games
drwxr-xr-x. 22 root root 4096 Sep 22 11:27 lib
drwxr-xr-x. 2 root root 4096 Sep 23 2011 local
drwxrwxr-x. 5 root lock 4096 Sep 29 11:36 lock
drwxr-xr-x. 7 root root 4096 Sep 22 11:27 log
lrwxrwxrwx. 1 root root 10 Jun 10 10:10 mail -> spool/mail
drwxr-xr-x. 2 root root 4096 Sep 23 2011 nis
drwxr-xr-x. 2 root root 4096 Sep 23 2011 opt
drwxr-xr-x. 2 root root 4096 Sep 23 2011 preserve
drwxr-xr-x. 18 root root 4096 Oct 19 21:58 run
drwxr-xr-x. 8 root root 4096 Jul 30 11:21 spool
drwxrwxrwt. 8 root root 4096 Sep 28 16:19 tmp
dr-xr-xr-x 4 root root 4096 Aug 28 14:05 www
drwxr-xr-x. 2 root root 4096 Sep 23 2011 yp
可见,当命令被正常执行时,err为'',没有任何内容。可以err的值进行判断,以确定命令是否执行成功。