python的subprocess模块

from  subprocess import Popen 能够看到Popen类的方法shell

 

Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.systemos.spawn*os.popen*popen2.*commands.*不但能够调用外部的命令做为子进程,并且能够链接到子进程的input/output/error管道,获取相关的返回信息编程

subprocess.call()
父进程等待子进程完成
返回退出信息(returncode,至关于Linux exit code)windows

subprocess.check_call()
父进程等待子进程完成
返回0
检查退出信息,若是returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性,可用try…except…来检查缓存

subprocess.check_output()
父进程等待子进程完成
返回子进程向标准输出的输出结果
检查退出信息,若是returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性和output属性,output属性为标准输出的输出结果,可用try…except…来检查。markdown

这三个函数的使用方法相相似,下面来以subprocess.call()举例说明:函数

代码以下:spa


>>> import subprocess
>>> retcode = subprocess.call(["ls", "-l"])
#shell中命令ls -a显示结果同样
>>> print retcode
0操作系统

将程序名(ls)和所带的参数(-l)一块儿放在一个表中传递给subprocess.call()code

shell默认为False,在Linux下,shell=False, Popen调用os.execvp()执行args指定的程序;shell=True时,若是args是字符串,Popen直接调用系统的Shell来执行args指定的程序,若是args是一个序列,则args的第一项是定义程序命令字符串,其它项是调用系统Shell时的附加参数。对象

上面例子也能够写成以下:

复制代码代码以下:

>>> retcode = subprocess.call("ls -l",shell=True)

subprocess的主类

复制代码代码以下:


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)

1)args能够是字符串或者序列类型(如:list,元组),用于指定进程的可执行文件及其参数。若是是序列类型,第一个元素一般是可执行文件的路径。咱们也能够显式的使用executeable参数来指定可执行文件的路径。

2)bufsize:指定缓冲。无缓冲,1 行缓冲,其余 缓冲区大小,负值 系统缓冲(全缓冲)

3)stdin, stdout, stderr分别表示程序的标准输入、输出、错误句柄。他们能够是subprocess.PIPE,文件描述符或文件对象,也能够设置为None,表示从父进程继承。

4)preexec_fn只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行以前被调用。

5)Close_sfs:在windows平台下,若是close_fds被设置为True,则新建立的子进程将不会继承父进程的输入、输出、错误管道。咱们不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)

6)shell设为true,程序将经过shell来执行。

7)cwd用于设置子进程的当前目录

8)env是字典类型,用于指定子进程的环境变量。若是env = None,子进程的环境变量将从父进程中继承。
Universal_newlines:不一样操做系统下,文本的换行符是不同的。如:windows下用'/r/n'表示换,而Linux下用'/n'。若是将此参数设置为TruePython统一把这些换行符看成'/n'来处理。startupinfocreateionflags只在windows下用效,它们将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等。

9)startupinfocreateionflags只在windows下有效,它们将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等。

Popen实例的方法

1)Popen.poll():用于检查子进程是否已经结束。设置并返回returncode属性。

2)Popen.wait():等待子进程结束。设置并返回returncode属性。

3)Popen.communicate(input=None):与子进程进行交互。向stdin发送数据,或从stdoutstderr中读取数据。可选参数input指定发送到子进程的参数。Communicate()返回一个元组:(stdoutdata, stderrdata)。注意:若是但愿经过进程的stdin向其发送数据,在建立Popen对象的时候,参数stdin必须被设置为PIPE。一样,若是但愿从stdoutstderr获取数据,必须将stdoutstderr设置为PIPE

4)Popen.send_signal(signal):向子进程发送信号。

5)Popen.terminate():中止(stop)子进程。在windows平台下,该方法将调用Windows API TerminateProcess()来结束子进程。

6)Popen.kill():杀死子进程。

7)Popen.stdin:若是在建立Popen对象是,参数stdin被设置为PIPEPopen.stdin将返回一个文件对象用于策子进程发送指令。不然返回None

8)Popen.stdout:若是在建立Popen对象是,参数stdout被设置为PIPEPopen.stdout将返回一个文件对象用于策子进程发送指令。不然返回None

9)Popen.stderr:若是在建立Popen对象是,参数stdout被设置为PIPEPopen.stdout将返回一个文件对象用于策子进程发送指令。不然返回None

10)Popen.pid:获取子进程的进程ID

11)Popen.returncode:获取进程的返回值。若是进程尚未结束,返回None

12)subprocess.call(*popenargs, **kwargs):运行命令。该函数将一直等待到子进程运行结束,并返回进程的returncode。文章一开始的例子就演示了call函数。若是子进程不须要进行交互,就能够使用该函数来建立。

13)subprocess.check_call(*popenargs, **kwargs):与subprocess.call(*popenargs, **kwargs)功能同样,只是若是子进程返回的returncode不为0的话,将触发CalledProcessError异常。在异常对象中,包括进程的returncode信息。

能够这样写

subprocess.Popen('脚本/shell', shell=True)

也能够这样

subprocess.call('脚本/shell', shell=True)


二者的区别是前者无阻塞,会和主程序并行运行,后者必须等待命令执行完毕,若是想要前者编程阻塞能够这样

s = subprocess.Popen('脚本/shell', shell=True)
s.wait()

>>> s = subprocess.Popen('ls -l', shell=True, stdout=subprocess.PIPE) 
>>>s.communicate() 
('\xe6\x80\xbb\xe7\x94\xa8\xe9\x87\x8f 152\n-rw------- 1 limbo limbo   808  7\xe6\x9c\x88  6 17:46 0000-00-00-welcome-to-jekyll.markdown.erb\ndrwx------ 2 limbo limbo  4096  8\xe6\x9c\x88 15 18:43 arg\ndrwx------ 2 limbo limbo  4096  8\xe6\x9c\x88  7 17:37 argv\ndrwxrwxr-x 2 limbo limbo  4096  9\xe6\x9c\x88 10 15:27 c\ndrwxrwxr-x 3 limbo limbo  4096  9\xe6\x9c\x88 11 14:35 d3\ndrwxrwxr-x 3 limbo limbo  4096  9\xe6\x9n', None)

能够在Popen()创建子进程的时候改变标准输入、标准输出和标准错误,并能够利用subprocess.PIPE将多个子进程的输入和输出链接在一块儿,构成管道(pipe),以下2个例子:


>>> import subprocess
>>> child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
>>> print child1.stdout.read(),
#或者child1.communicate()
>>> import subprocess
>>> child1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE)
>>> child2 = subprocess.Popen(["grep","0:0"],stdin=child1.stdout, stdout=subprocess.PIPE)
>>> out = child2.communicate()


subprocess.PIPE实际上为文本流提供一个缓存区child1stdout将文本输出到缓存区,随后child2stdin从该PIPE中将文本读取走。child2的输出文本也被存放在PIPE中,直到communicate()方法从PIPE中读取出PIPE中的文本。
注意:communicate()Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成

相关文章
相关标签/搜索