home *** CD-ROM | disk | FTP | other *** search
/ com!online 2005 April / com_0405_1.iso / opensource / BTpp-0.5.4-bin.exe / $INSTDIR / BT++.exe / popen2.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2003-04-19  |  6.1 KB  |  202 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.2)
  3.  
  4. import os
  5. import sys
  6. import types
  7. __all__ = [
  8.     'popen2',
  9.     'popen3',
  10.     'popen4']
  11. MAXFD = 256
  12. _active = []
  13.  
  14. def _cleanup():
  15.     for inst in _active[:]:
  16.         inst.poll()
  17.     
  18.  
  19.  
  20. class Popen3:
  21.     sts = -1
  22.     
  23.     def __init__(self, cmd, capturestderr = 0, bufsize = -1):
  24.         _cleanup()
  25.         (p2cread, p2cwrite) = os.pipe()
  26.         (c2pread, c2pwrite) = os.pipe()
  27.         if capturestderr:
  28.             (errout, errin) = os.pipe()
  29.         
  30.         self.pid = os.fork()
  31.         if self.pid == 0:
  32.             os.dup2(p2cread, 0)
  33.             os.dup2(c2pwrite, 1)
  34.             if capturestderr:
  35.                 os.dup2(errin, 2)
  36.             
  37.             self._run_child(cmd)
  38.         
  39.         os.close(p2cread)
  40.         self.tochild = os.fdopen(p2cwrite, 'w', bufsize)
  41.         os.close(c2pwrite)
  42.         self.fromchild = os.fdopen(c2pread, 'r', bufsize)
  43.         if capturestderr:
  44.             os.close(errin)
  45.             self.childerr = os.fdopen(errout, 'r', bufsize)
  46.         else:
  47.             self.childerr = None
  48.         _active.append(self)
  49.  
  50.     
  51.     def _run_child(self, cmd):
  52.         if isinstance(cmd, types.StringTypes):
  53.             cmd = [
  54.                 '/bin/sh',
  55.                 '-c',
  56.                 cmd]
  57.         
  58.         for i in range(3, MAXFD):
  59.             
  60.             try:
  61.                 os.close(i)
  62.             except:
  63.                 pass
  64.  
  65.         
  66.         
  67.         try:
  68.             os.execvp(cmd[0], cmd)
  69.         finally:
  70.             os._exit(1)
  71.  
  72.  
  73.     
  74.     def poll(self):
  75.         if self.sts < 0:
  76.             
  77.             try:
  78.                 (pid, sts) = os.waitpid(self.pid, os.WNOHANG)
  79.                 if pid == self.pid:
  80.                     self.sts = sts
  81.                     _active.remove(self)
  82.             except os.error:
  83.                 pass
  84.  
  85.         
  86.         return self.sts
  87.  
  88.     
  89.     def wait(self):
  90.         (pid, sts) = os.waitpid(self.pid, 0)
  91.         if pid == self.pid:
  92.             self.sts = sts
  93.             _active.remove(self)
  94.         
  95.         return self.sts
  96.  
  97.  
  98.  
  99. class Popen4(Popen3):
  100.     childerr = None
  101.     
  102.     def __init__(self, cmd, bufsize = -1):
  103.         _cleanup()
  104.         (p2cread, p2cwrite) = os.pipe()
  105.         (c2pread, c2pwrite) = os.pipe()
  106.         self.pid = os.fork()
  107.         if self.pid == 0:
  108.             os.dup2(p2cread, 0)
  109.             os.dup2(c2pwrite, 1)
  110.             os.dup2(c2pwrite, 2)
  111.             self._run_child(cmd)
  112.         
  113.         os.close(p2cread)
  114.         self.tochild = os.fdopen(p2cwrite, 'w', bufsize)
  115.         os.close(c2pwrite)
  116.         self.fromchild = os.fdopen(c2pread, 'r', bufsize)
  117.         _active.append(self)
  118.  
  119.  
  120. if sys.platform[:3] == 'win':
  121.     del Popen3
  122.     del Popen4
  123.     
  124.     def popen2(cmd, bufsize = -1, mode = 't'):
  125.         (w, r) = os.popen2(cmd, mode, bufsize)
  126.         return (r, w)
  127.  
  128.     
  129.     def popen3(cmd, bufsize = -1, mode = 't'):
  130.         (w, r, e) = os.popen3(cmd, mode, bufsize)
  131.         return (r, w, e)
  132.  
  133.     
  134.     def popen4(cmd, bufsize = -1, mode = 't'):
  135.         (w, r) = os.popen4(cmd, mode, bufsize)
  136.         return (r, w)
  137.  
  138. else:
  139.     
  140.     def popen2(cmd, bufsize = -1, mode = 't'):
  141.         inst = Popen3(cmd, 0, bufsize)
  142.         return (inst.fromchild, inst.tochild)
  143.  
  144.     
  145.     def popen3(cmd, bufsize = -1, mode = 't'):
  146.         inst = Popen3(cmd, 1, bufsize)
  147.         return (inst.fromchild, inst.tochild, inst.childerr)
  148.  
  149.     
  150.     def popen4(cmd, bufsize = -1, mode = 't'):
  151.         inst = Popen4(cmd, bufsize)
  152.         return (inst.fromchild, inst.tochild)
  153.  
  154.     __all__.extend([
  155.         'Popen3',
  156.         'Popen4'])
  157.  
  158. def _test():
  159.     cmd = 'cat'
  160.     teststr = 'ab cd\n'
  161.     if os.name == 'nt':
  162.         cmd = 'more'
  163.     
  164.     expected = teststr.strip()
  165.     print 'testing popen2...'
  166.     (r, w) = popen2(cmd)
  167.     w.write(teststr)
  168.     w.close()
  169.     got = r.read()
  170.     if got.strip() != expected:
  171.         raise ValueError('wrote %s read %s' % (`teststr`, `got`))
  172.     
  173.     print 'testing popen3...'
  174.     
  175.     try:
  176.         (r, w, e) = popen3([
  177.             cmd])
  178.     except:
  179.         (r, w, e) = popen3(cmd)
  180.  
  181.     w.write(teststr)
  182.     w.close()
  183.     got = r.read()
  184.     if got.strip() != expected:
  185.         raise ValueError('wrote %s read %s' % (`teststr`, `got`))
  186.     
  187.     got = e.read()
  188.     if got:
  189.         raise ValueError('unexected %s on stderr' % `got`)
  190.     
  191.     for inst in _active[:]:
  192.         inst.wait()
  193.     
  194.     if _active:
  195.         raise ValueError('_active not empty')
  196.     
  197.     print 'All OK'
  198.  
  199. if __name__ == '__main__':
  200.     _test()
  201.  
  202.