python中的subprocess子进程

在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 subprocess
cmd = [ 'ls' , '-l];
ret = subprocess . call ( cmd )
cmd = [ 'exit 1' ];
ret = subprocess . call ( cmd , shell = True );
 来自CODE的代码片
testsubprocess.py
1.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.PIPE

child2.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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值