在Python中,我们通过使用标准库中的subprocess模块来fork一个子进程,并运行一个外部的程序(类似于在linux中fork一个子进程,然后在子进程中exec另外一个程序)。
这一模块中提供了多种方法:
1. subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
1.1 参数args描述了子进程中需要执行的命令;
1.2 父进程会等待子进程的结束,并获得call函数的返回值
1 2 3 4 5 6 7 import subprocesscmd = [ 'ls' , '-l];ret = subprocess . call ( cmd )cmd = [ 'exit 1' ];ret = subprocess . call ( cmd , shell = True );来自CODE的代码片
testsubprocess.py1.3 如果子进程不需要进行交互,就可以使用该函数来创建
2. subprocess.check_all(args, *, stdin=None, stdout=None, stderr=None, shell=False)
2.1 check_all()与call()唯一的区别在于返回值。如果args执行之后的返回值为0,那么check_all返回0;如果返回值不为0,那么将raise出来一个CalledProcessError
3. subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
3.1 子进程执行args中的命令,并将其输出形成字符串返回
3.2 如果返回值非零,那么将raise一个CalledProcessError。这一对象实例中有returncode属性以及output属性(args命令的output)
4. subprocess.Popen()
4.1 详细格式: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)
4.2 Popen对象创建后,主程序不会自动等待子进程完成。我们必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block)
4.3 Popen中封装的其他函数:
4.3.1 Popen.poll():检查子进程的状态,查看子进程是否结束
4.3.2 Popen.wait():等待子进程的结束
4.3.3 Popen.communicate(input=None):与子进程进行交互。向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。Communicate()返回一个元组:(stdoutdata, stderrdata)。注意:如果希望通过进程的stdin向其发送数据,在创建Popen对象的时候,参数stdin必须被设置为PIPE。同样,如果希望从stdout和stderr获取数据,必须将stdout和stderr设置为PIPE。
4.3.4 Popen.send_signal(signal):向子进程发送信号
4.3.5 Popen.terminate():停止(stop)子进程。在windows平台下,该方法将调用Windows API TerminateProcess()来结束子进程
4.3.6 Popen.kill():杀死子进程
4.3.7 Popen.stdin:如果在创建Popen对象是,参数stdin被设置为PIPE,Popen.stdin将返回一个文件对象用于策子进程发送指令;否则返回None
4.3.8 Popen.stdout:如果在创建Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令;否则返回None
4.3.9 Popen.stderr:如果在创建Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令;否则返回None
4.3.10 Popen.pid:获取子进程的进程ID
4.3.11 Popen.returncode:获取进程的返回值。如果进程还没有结束,返回None
给子进程输入
代码如下:
import subprocess
child = subprocess.Popen(["cat"], stdin=subprocess.PIPE)
child.communicate("vamei")
communicate()不为空,则写入subprocess.PIPE,为空,则从subprocess.PIPE读取
subprocess.PIPE代码如下:
#!/usr/bin/env python
import subprocess
child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
print out
实际上是这样的过程
代码如下:
child1.stdout-->subprocess.PIPEchild2.stdin<--subprocess.PIPE
child2.stdout-->subprocess.PIPE
要注意的是,communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成。subprocess.PIPE实际上为文本流提供一个缓存区。直到communicate()方法从PIPE中读取出PIPE中的文本.要注意的是,communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成。
更详细的信息:http://docs.python.org/2/library/subprocess.html,http://www.jb51.net/article/57208.htm