title: python unable to detach process when teed. How to span background process and exit with no wait?
body: <p>I started with a simple testcase:</p>
  
  <pre><code>cat foo2.py
  #!/usr/bin/python
  import subprocess, sys, os
  
  def alert():
      subprocess.Popen ("xterm &amp;", shell=True, stdin=None, stdout=None, stderr=None, close_fds=True)
  
  if __name__ == "__main__":
  
     print "hello"
     alert ()
     os._exit (0)
  </code></pre>
  
  <p>When I run that code on the command line regularly, it works:</p>
  
  <pre><code>./foo2.py
  </code></pre>
  
  <p>returns the unix prompt, and the xterm is running in the background.</p>
  
  <p>However, when I run that code with a tee</p>
  
  <pre><code>./foo2.py | tee my.log
  </code></pre>
  
  <p>I do not get the unix prompt until I close the xterm.</p>
  
  <p>How can I get the python script to exit, but keep the xterm running in the background?</p>
  
  <p>I've seen: <a href="https://stackoverflow.com/questions/5772873/python-spawn-off-a-child-subprocess-detach-and-exit">Python spawn off a child subprocess, detach, and exit</a> and the activestate recipe mentioned there. I've used that code to create a simple testcase which just opens an xterm in the background:</p>
  
  <pre><code>cat foo.py
  #!/usr/bin/python
  import subprocess, sys, os
  
  def alert():
      subprocess.Popen ("xterm &amp;", shell=True, stdin=None, stdout=None, stderr=None)
  
  def createDaemon():
     """Detach a process from the controlling terminal and run it in the
     background as a daemon.
     """
     try:
        pid = os.fork()   # Fork a first child.
     except OSError, e:
        raise Exception, "%s [%d]" % (e.strerror, e.errno)
  
     if (pid == 0):   # The first child.
        os.setsid()
        try:
           pid = os.fork()    # Fork a second child.
        except OSError, e:
           raise Exception, "%s [%d]" % (e.strerror, e.errno)
  
        if (pid == 0):    # The second child.
       alert () 
        else:
           os._exit(0)    # Exit parent (the first child) of the second child.
     else:
        os._exit(0)   # Exit parent of the first child.
  
     # Close all open file descriptors.  This prevents the child from keeping
     import resource      # Resource usage information.
     maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
     if (maxfd == resource.RLIM_INFINITY):
        maxfd = 1024
  
     # Iterate through and close all file descriptors.
     for fd in range(0, maxfd):
        try:
           os.close(fd)
        except OSError:   # ERROR, fd wasn't open to begin with (ignored)
           pass
  
     os.open(REDIRECT_TO, os.O_RDWR)  # standard input (0)
     os.dup2(0, 1)            # standard output (1)
     os.dup2(0, 2)            # standard error (2)
  
     return(0)
  
  if __name__ == "__main__":
  
     print "hello"
     retCode = createDaemon()
  
     sys.exit (0)
  </code></pre>
  
  <p>When I run that code on the command line regularly, it works:</p>
  
  <pre><code>./foo.py
  </code></pre>
  
  <p>returns the unix prompt, and the xterm is running in the background.</p>
  
  <p>However, when I run that code with a tee</p>
  
  <pre><code>./foo.py | tee my.log
  </code></pre>
  
  <p>I do not get the unix prompt until I close the xterm.</p>
  
  <p>How can I get the python script to exit, but keep the xterm running in the background?</p>