Package gmisclib :: Module g_pipe_old
[frames] | no frames]

Source Code for Module gmisclib.g_pipe_old

  1  """A multithreaded version of os.popen2().  Note that the argument list 
  2  isn't quite the same.""" 
  3   
  4   
  5  import os 
  6   
  7   
  8   
  9   
10 -class pfd(object):
11 __doc__ = """Pseudo-file descriptor. Just like a FD, except 12 that it waits for the process at the end of the pipe 13 to terminate when you close it. 14 """ 15
16 - def __init__(self, fd, cpid):
17 self.fd = os.fdopen(fd, "r") 18 self.cpid = cpid 19 self.mode = "r" 20 self.waitval = None 21 self.closed = False 22 23 self.readline = self.fd.readline 24 self.next = self.fd.next 25 self.flush = self.fd.flush 26 self.__iter__ = self.fd.__iter__ 27 self.read = self.fd.read 28 self.readlines = self.fd.readlines 29 self.fileno = self.fd.fileno
30 31 # def read ... copied from file.read
32 - def read(self):
33 return self.fd.read()
34 35 # def readline ... copied from file.readline
36 - def readline(self):
37 return self.fd.readline()
38 39 # def readlines ... copied from file.readlines
40 - def readlines(self):
41 return self.fd.readlines()
42 43 # def next ... copied from file.next
44 - def next(self):
45 return self.fd.next()
46 47 # def __iter__ ... copied from file.__iter__ 48
49 - def __iter__(self):
50 return self.fd.__iter__()
51 52 # def flush ... copied from file.flush
53 - def flush():
54 return
55 56 # def fileno ... copied from file.fileno 57 58
59 - def xreadlines(self, sizehint=-1):
60 return self.fd.xreadlines(sizehint)
61 62
63 - def close(self):
64 if not self.closed: 65 self.fd.close() 66 self.closed = True 67 pid, t2 = os.waitpid(self.cpid, 0) 68 if t2 == 0: 69 self.waitval = None 70 else: 71 self.waitval = t2 72 return self.waitval
73 74
75 - def __del__(self):
76 self.close()
77 78
79 -def popen2(path, args):
80 """Forks off a process, and returns the processes 81 input and output file descriptors. The latter is really 82 a pfd (defined above). 83 84 Path and args are passed directly into os.execvp(). 85 """ 86 87 rci, wci = os.pipe() 88 rco, wco = os.pipe() 89 90 cpid = os.fork() 91 if cpid == 0: 92 # child 93 os.close(rco) 94 os.close(wci) 95 os.dup2(rci, 0) 96 os.dup2(wco, 1) 97 os.execvp(path, args) 98 os._exit(127) 99 100 os.close(rci) 101 os.close(wco) 102 return (os.fdopen(wci, "w"), pfd(rco, cpid))
103 104
105 -def test():
106 si, so = popen2("sed", ["sed", "-e", "s/or/er/"]) 107 si.write("hello, world!\nsecond line\n") 108 si.close() 109 assert so.readline() == "hello, werld!\n" 110 a = so.readlines() 111 assert len(a) == 1 112 assert a[0] == "second line\n" 113 tmp = so.close() 114 assert tmp is None
115 116 if __name__ == '__main__': 117 test() 118 test() 119