如何非阻塞地获得子进程输出?

如何非阻塞地获得子进程输出?

现在我使用subprocess模块来创建子进程,并重定向子进程的标准输入,错误输出。父进程从管道中读取子进程的错误输出,但是问题在于,父进程在读取时可能会阻塞,原因可能因为缓冲未满的缘故,所以现在我只能每次关闭重定向后的标准输入管道,这样当子进程结束后就可以非阻塞地读取错误输出了。但是由于每次创建子进程有一定的开销(我需要几百次,可能几千次地创建子进程),这样会降低效率,是否有什么方法可以非阻塞地获取子进程的输出。网上看到有使用select()函数的方法,但是我是在windows下运行该脚本,windows的select实现对于非socket句柄是无法调用的。
找到一个提供非阻塞IO的subprocess模块的扩展
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440554

后来自己想了一下在自己的程序里,即使使用非阻塞IO也未必能够解决我的问题,只能再想想其他的方法了

给个代码看看?
由于需要检测某段LUA脚本是否包含语法错误,所以将该段LUA脚本重定向到LUA解释器,之后再获取LUA解释器的错误输出,如果没有错误输出即表明代码可以通过。后来发现对于一段错误的LUA脚本,输入给LUA解释器,可能无法及时获得相应的错误信息,一方面由于解释器的问题,另一方面可能由于Popen管道缓冲的问题。

刚试了一下Popen.communicate与子进程通信,可以很快地获得子进程的错误输出,看了源代码后才知道,它采用的方法是:将数据写入到子进程的标准输入,之后关闭输入流,这样最后子进程结束后,就可以无阻塞地获得错误输出了。这个方法也行不通。
用管道!缓存未满!阻塞!

flush 能满足要求吗?
建议使用*nix系统,win的有问题。
关于楼主说的问题很想研究下
from subprocess import *
sp = Popen(['python','rec.py'],stdout=PIPE,stderr=PIPE,shell=True, bufsize=0)
for err in sp.stderr.readlines():
    print err