Problems with select
Alain Tesio
alain at onesite.org
Mon Feb 25 22:17:30 EST 2002
Hi, I can't manage to make select work, in both 1.52 and 2.1.2
I just want to read stderr and stdout when executing a command
with popen3, and I must use select, read() blocks when there is
more than a fixed amount of data (4 KB I think)
The problems is that select still gives something after the end
of the file, or sometimes never returns anything at all.
I create the pipes with :
(pipe_out,pipe_in,pipe_err)=popen2.popen3(command)
and use select like this:
pollstatus=select.select([],[pipe_out],[pipe_err],1)
(the doc says : select(iwtd, owtd, ewtd[, timeout])
I didn't put pipe_in as it's closed)
Here is my test program:
========================
#!/usr/bin/python
import sys,select,popen2,string
def execute(command,maxiter):
(pipe_out,pipe_in,pipe_err)=popen2.popen3(command)
pipe_in.close()
pipes=[pipe_out,pipe_err]
gotsomething=1
i=0
while gotsomething:
gotsomething=0
i=i+1
if i>maxiter:
print "maxiter reached"
sys.exit(0)
pollstatus=select.select([],[pipe_out],[pipe_err],1)
print "select returns : ",pollstatus
for (pollitem,label,pipe) in ((1,"out",pipe_out),
(2,"err",pipe_err)):
if pollstatus[pollitem]:
print "%i on %s : '%s'" % (i,label,string.strip(pipe.readline()))
gotsomething=1
execute("cat 3lines",10)
========================
And the ouput continues after the file is exhausted (readline doesn't
fail), same problem with no timeout.
04:09:32 alain ~/tmp $wc -l 3lines
3 3lines
04:09:32 alain ~/tmp $./test_select.py
select returns : ([], [<open file '(fdopen)', mode 'r' at 0x8060480>], [])
1 on out : 'first'
select returns : ([], [<open file '(fdopen)', mode 'r' at 0x8060480>], [])
2 on out : 'second'
select returns : ([], [<open file '(fdopen)', mode 'r' at 0x8060480>], [])
3 on out : 'third'
select returns : ([], [<open file '(fdopen)', mode 'r' at 0x8060480>], [])
4 on out : ''
select returns : ([], [<open file '(fdopen)', mode 'r' at 0x8060480>], [])
5 on out : ''
select returns : ([], [<open file '(fdopen)', mode 'r' at 0x8060480>], [])
6 on out : ''
select returns : ([], [<open file '(fdopen)', mode 'r' at 0x8060480>], [])
7 on out : ''
select returns : ([], [<open file '(fdopen)', mode 'r' at 0x8060480>], [])
8 on out : ''
select returns : ([], [<open file '(fdopen)', mode 'r' at 0x8060480>], [])
9 on out : ''
select returns : ([], [<open file '(fdopen)', mode 'r' at 0x8060480>], [])
10 on out : ''
maxiter reached
And sometimes (really randomly, about 1 time out of 10) it just gives
nothing, with no timeout it hangs forever.
04:11:28 alain ~/tmp $./test_select.py
select returns : ([], [], [])
What did I miss ?
I've succeeded with select.poll but I must use select.select to have my
program usable with python 1.52 (still in Debian stable)
Thanks
Alain
More information about the Python-list
mailing list