5 MAXFD
= 256 # Max number of file descriptors (os.getdtablesize()???)
10 for inst
in _active
[:]:
14 def __init__(self
, cmd
, capturestderr
=0, bufsize
=-1):
15 if type(cmd
) == type(''):
16 cmd
= ['/bin/sh', '-c', cmd
]
17 p2cread
, p2cwrite
= os
.pipe()
18 c2pread
, c2pwrite
= os
.pipe()
20 errout
, errin
= os
.pipe()
26 if os
.dup(p2cread
) <> 0:
27 sys
.stderr
.write('popen2: bad read dup\n')
28 if os
.dup(c2pwrite
) <> 1:
29 sys
.stderr
.write('popen2: bad write dup\n')
32 if os
.dup(errin
) <> 2: pass
33 for i
in range(3, MAXFD
):
38 os
.execvp(cmd
[0], cmd
)
41 # Shouldn't come here, I guess
44 self
.tochild
= os
.fdopen(p2cwrite
, 'w', bufsize
)
46 self
.fromchild
= os
.fdopen(c2pread
, 'r', bufsize
)
49 self
.childerr
= os
.fdopen(errout
, 'r', bufsize
)
52 self
.sts
= -1 # Child not completed yet
57 pid
, sts
= os
.waitpid(self
.pid
, os
.WNOHANG
)
65 pid
, sts
= os
.waitpid(self
.pid
, 0)
71 def popen2(cmd
, bufsize
=-1):
73 inst
= Popen3(cmd
, 0, bufsize
)
74 return inst
.fromchild
, inst
.tochild
76 def popen3(cmd
, bufsize
=-1):
78 inst
= Popen3(cmd
, 1, bufsize
)
79 return inst
.fromchild
, inst
.tochild
, inst
.childerr
83 print "testing popen2..."
87 assert r
.read() == teststr
88 print "testing popen3..."
89 r
, w
, e
= popen3(['cat'])
92 assert r
.read() == teststr
98 if __name__
== '__main__':