subprocess模块

subprocess模块目标启动新的进程,并与之进行通信。

1、Call:执行程序,等待它完成,返回状态码。

import subprocess
ret1 = subprocess.call([
"cp ","-p"],shell=True)
ret2 = subprocess.call([
"cp","-p"],shell=False)

Shell = True 允许shell是字符串形式。


def call(*popenargs, **kwargs):
    
return Popen(*popenargs, **kwargs).wait()

 

2、call_check()调用前面的call()函数,如果返回值非零,则抛出异常。


def check_call(*popenargs, **kwargs):
    
retcode = call(*popenargs, **kwargs)
    
if retcode:
        cmd = kwargs.get(
"args")
        
if cmd is None:
            cmd = popenargs[
0]
        
raise CalledProcessError(retcode, cmd)
    
return 0

 

3、check_output():执行程序,如果返回码是0,则返回执行结果。

 

def check_output(*popenargs, **kwargs):
    
if 'stdout' in kwargs:
        
raise ValueError('stdout argument not allowed, it will be overridden.')
    process = Popen(
stdout=PIPE, *popenargs, **kwargs)
    
output, unused_err = process.communicate()
    retcode = process.poll()
    
if retcode:
        cmd = kwargs.get(
"args")
        
if cmd is None:
            cmd = popenargs[
0]
        
raise CalledProcessError(retcode, cmd, output=output)
    
return output

4、subprocess还提供了非常重要的类Popen:执行复杂的系统命令。

class Popen(object):
    
def __init__(self, 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
shell命令可以是字符串或者列表
bufsize0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
executable一般不用
stdin stdout stderr标准输出、输出、错误句柄
preexec_fn只在Unix平台下执行,用于指定一个可执行对象,在子进程执行之前调用
close_fds在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
shell同上
cwd用于设置子进程的当前目录
env用于设置子进程的环境变量
universal_newlines各种换行符设置成\n
startupinfowindow下传递给CreateProcess的结构体,只在Windows下有效
creationflagswindows下,传递CREATE_NEW_CONSOLE创建自己的控制台窗口,在Windows下有效

Popen的方法:

poll()
检查是否结束,设置返回值
wait()等待结束,设置返回值
communicate()
参数是标准输入,返回标准输出和错误
send_signal()
发送信号,主要在linux下使用
terminate()
终止信号
kill()
杀死进程
PID
进程id
returncode
进程返回值
stdin
stdout
stderr
参数中指定PIPE时,有用

例子:

  1. import subprocess
  2. obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  3. obj.stdin.write('print 1 \n ')
  4. obj.stdin.write('print 2 \n ')
  5. obj.stdin.write('print 3 \n ')
  6. obj.stdin.write('print 4 \n ')
  7. obj.stdin.close()
  8. cmd_out = obj.stdout.read()
  9. obj.stdout.close()
  10. cmd_error = obj.stderr.read()
  11. obj.stderr.close()
  12. print cmd_out
  13. print cmd_error

参考网址:http://www.cnblogs.com/wupeiqi/articles/4963027.html