Tags : Ajax  apache  awk  besttrace  bootstrap  CDN  Django  git 

常见问题

实践: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的值进行判断,以确定命令是否执行成功。



标签 :  python包 上一篇     下一篇