Python论坛  - 讨论区

标题:[python-chinese] 如何非阻塞地读取子进程的输出

2005年07月01日 星期五 09:17

Hong Yuan hongyuan at homemaster.cn
Fri Jul 1 09:17:18 HKT 2005

select.select只有在返回是非空时后续的read()才能保证运行。你的代码里没有
做这个判断,另外在readline和后续的read之间也没有继续用select判断是否有新
的内容可读,所以可能在特定环境下能够运行,但到其他地方就不行了。

nEO wrote:

> 这段代码工作正常
> 但是还是没明白为什么我的那段代码你不能运行
>
>
> 2005/6/30, Hong Yuan <hongyuan at homemaster.cn
> hongyuan at homemaster.cn>>:
>
>     谢谢大家的帮助。最后下面这段代码工作得很好:
>
>     import os, fcntl, select
>
>     cmd = 'python test.py'
>
>     timeout = 2
>     pin, pout = os.popen2(cmd)
>
>     pout = pout.fileno()
>     flags = fcntl.fcntl(pout, fcntl.F_GETFL)
>     fcntl.fcntl(pout, fcntl.F_SETFL, flags | os.O_NONBLOCK)
>
>     while 1:
>     i,o,e = select.select([pout], [], [], timeout)
>     if i :
>     buf = os.read(pout, 1024)
>     if buf:
>     print buf
>     else:
>     break
>
>     由fcntl函数将文件设为非阻塞模式,用select来判断是否有数据可读,然后用
>     os.read读取当前可读的所有数据。
>
>     --
>     HONG Yuan
>
>     大管家网上建材超市
>     http://www.homemaster.cn
>
>     _______________________________________________
>     python-chinese list
>     python-chinese at lists.python.cn python-chinese at lists.python.cn>
>     http://python.cn/mailman/listinfo/python-chinese
>
>
>
>
> -- 
> I'm the one, powered by nEO
>
>------------------------------------------------------------------------
>
>_______________________________________________
>python-chinese list
>python-chinese at lists.python.cn
>http://python.cn/mailman/listinfo/python-chinese
>  
>

-- 
HONG Yuan

大管家网上建材超市
http://www.homemaster.cn


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月01日 星期五 12:44

shhgs shhgs.efhilt at gmail.com
Fri Jul 1 12:44:37 HKT 2005

readline和read根本没关系。

select是判断流是不是可读,至于用readline还是read根本没关系。(我不知道可读具体是什么意思,是指文件锁解开了,还是指有数据到了)。反正,原先的代码有两个问题,一是没有返回input流的集合,二是没有把它放到while循环里。跟用read还是readline没关系。

On 6/30/05, Hong Yuan <hongyuan at homemaster.cn> wrote:
> select.select只有在返回是非空时后续的read()才能保证运行。你的代码里没有
> 做这个判断,另外在readline和后续的read之间也没有继续用select判断是否有新
> 的内容可读,所以可能在特定环境下能够运行,但到其他地方就不行了。
> 
> nEO wrote:
> 
> > 这段代码工作正常
> > 但是还是没明白为什么我的那段代码你不能运行
> >
> >
> > 2005/6/30, Hong Yuan <hongyuan at homemaster.cn
> > hongyuan at homemaster.cn>>:
> >
> >     谢谢大家的帮助。最后下面这段代码工作得很好:
> >
> >     import os, fcntl, select
> >
> >     cmd = 'python test.py'
> >
> >     timeout = 2
> >     pin, pout = os.popen2(cmd)
> >
> >     pout = pout.fileno()
> >     flags = fcntl.fcntl(pout, fcntl.F_GETFL)
> >     fcntl.fcntl(pout, fcntl.F_SETFL, flags | os.O_NONBLOCK)
> >
> >     while 1:
> >     i,o,e = select.select([pout], [], [], timeout)
> >     if i :
> >     buf = os.read(pout, 1024)
> >     if buf:
> >     print buf
> >     else:
> >     break
> >
> >     由fcntl函数将文件设为非阻塞模式,用select来判断是否有数据可读,然后用
> >     os.read读取当前可读的所有数据。
> >
> >     --
> >     HONG Yuan
> >
> >     大管家网上建材超市
> >     http://www.homemaster.cn
> >
> >     _______________________________________________
> >     python-chinese list
> >     python-chinese at lists.python.cn python-chinese at lists.python.cn>
> >     http://python.cn/mailman/listinfo/python-chinese
> >
> >
> >
> >
> > --
> > I'm the one, powered by nEO
> >
> >------------------------------------------------------------------------
> >
> >_______________________________________________
> >python-chinese list
> >python-chinese at lists.python.cn
> >http://python.cn/mailman/listinfo/python-chinese
> >
> >
> 
> --
> HONG Yuan
> 
> 大管家网上建材超市
> http://www.homemaster.cn
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月01日 星期五 13:39

nEO gentoo.cn at gmail.com
Fri Jul 1 13:39:11 HKT 2005

是指有数据可读
之所以用readline是因为他的test.py的输出是有\n的
使用readline可以返回,后面我演示了用read(1)也是一样
如果只用read是要等到EOF才返回的

在05-7-1,shhgs <shhgs.efhilt at gmail.com> 写道:
> 
> readline和read根本没关系。
> 
> 
> select是判断流是不是可读,至于用readline还是read根本没关系。(我不知道可读具体是什么意思,是指文件锁解开了,还是指有数据到了)。反正,原先的代码有两个问题,一是没有返回input流的集合,二是没有把它放到while循环里。跟用read还是readline没关系。
> 
> On 6/30/05, Hong Yuan <hongyuan at homemaster.cn> wrote:
> > select.select只有在返回是非空时后续的read()才能保证运行。你的代码里没有
> > 做这个判断,另外在readline和后续的read之间也没有继续用select判断是否有新
> > 的内容可读,所以可能在特定环境下能够运行,但到其他地方就不行了。
> >
> > nEO wrote:
> >
> > > 这段代码工作正常
> > > 但是还是没明白为什么我的那段代码你不能运行
> > >
> > >
> > > 2005/6/30, Hong Yuan <hongyuan at homemaster.cn
> > > hongyuan at homemaster.cn>>:
> > >
> > > 谢谢大家的帮助。最后下面这段代码工作得很好:
> > >
> > > import os, fcntl, select
> > >
> > > cmd = 'python test.py'
> > >
> > > timeout = 2
> > > pin, pout = os.popen2(cmd)
> > >
> > > pout = pout.fileno()
> > > flags = fcntl.fcntl(pout, fcntl.F_GETFL)
> > > fcntl.fcntl(pout, fcntl.F_SETFL, flags | os.O_NONBLOCK)
> > >
> > > while 1:
> > > i,o,e = select.select([pout], [], [], timeout)
> > > if i :
> > > buf = os.read(pout, 1024)
> > > if buf:
> > > print buf
> > > else:
> > > break
> > >
> > > 由fcntl函数将文件设为非阻塞模式,用select来判断是否有数据可读,然后用
> > > os.read读取当前可读的所有数据。
> > >
> > > --
> > > HONG Yuan
> > >
> > > 大管家网上建材超市
> > > http://www.homemaster.cn
> > >
> > > _______________________________________________
> > > python-chinese list
> > > python-chinese at lists.python.cn python-chinese at lists.python.cn>
> > > http://python.cn/mailman/listinfo/python-chinese
> > >
> > >
> > >
> > >
> > > --
> > > I'm the one, powered by nEO
> > >
> > 
> >------------------------------------------------------------------------
> > >
> > >_______________________________________________
> > >python-chinese list
> > >python-chinese at lists.python.cn
> > >http://python.cn/mailman/listinfo/python-chinese
> > >
> > >
> >
> > --
> > HONG Yuan
> >
> > 大管家网上建材超市
> > http://www.homemaster.cn
> >
> > _______________________________________________
> > python-chinese list
> > python-chinese at lists.python.cn
> > http://python.cn/mailman/listinfo/python-chinese
> >
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
> 


-- 
I'm the one, powered by nEO
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050701/f43b123e/attachment.html

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月01日 星期五 15:01

Hong Yuan hongyuan at homemaster.cn
Fri Jul 1 15:01:17 HKT 2005

无论是readline、read()还是read(1),文件缓冲区中读必须有内容可读,否则就
会阻塞住。read()要到EOF才返回, readline()要到'\n'才返回,read(1)要到读
了一个字节以后才返回。

select只是保证缓冲区中有内容,下一个读操作可以进行。但如果读操作需要的字
节数大于缓冲区的字节数,读操作还是会阻塞住,知道所需的数据完整或碰到EOF。

fnctl将文件描述符设置为非阻塞方式,只要select指明缓冲区可读,read操作都
可以马上返回,如果读不到足够的数据,那么读到多少算多少。但之前select操作
是必要的,否则有时会返回文件暂时无法访问的错误。

nEO wrote:

> 是指有数据可读
> 之所以用readline是因为他的test.py的输出是有\n的
> 使用readline可以返回,后面我演示了用read(1)也是一样
> 如果只用read是要等到EOF才返回的
>
> 在05-7-1,*shhgs* <shhgs.efhilt at gmail.com
> shhgs.efhilt at gmail.com>> 写道:
>
>     readline 和read根本没关系。
>
>     select是判断流是不是可读,至于用readline还是read根本没关系。(我不
>     知道可读具体是什么意思,是指文件锁解开了,还是指有数据到了)。反
>     正,原先的代码有两个问题,一是没有返回input流的集合,二是没有把它
>     放到while循环里。跟用read还是readline没关系。
>
>     On 6/30/05, Hong Yuan < hongyuan at homemaster.cn
>     hongyuan at homemaster.cn>> wrote:
>     > select.select只有在返回是非空时后续的read()才能保证运行。你的代
>     码里没有
>     > 做这个判断,另外在readline和后续的read之间也没有继续用select判断
>     是否有新
>     > 的内容可读,所以可能在特定环境下能够运行,但到其他地方就不行了。
>     >
>     > nEO wrote:
>     >
>     > > 这段代码工作正常
>     > > 但是还是没明白为什么我的那段代码你不能运行
>     > >
>     > >
>

-- 
HONG Yuan

大管家网上建材超市
http://www.homemaster.cn


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号