title: When does subprocess.Popen return None in Python , sporadically?
body: <p>In the following code, I am trying to fork a process for running a command and then capture back the result when the child subprocess has exited.</p>
  
  <p>In the end a loop is run , on a global var, to wait for child process to end so that parent process doesn't exit before child process but overall running of command is non-blocking in a way. The code is working fine 9 out of 10 times but once in a while is giving the error. </p>
  
  <p>Error is in case when it seems <code>subprocess.Popen</code> returned <code>None</code>. But I am not sure why would that happen randomly. </p>
  
  <p>Can somebody please help in figuring out what is going wrong here ? </p>
  
  <p><strong>Machine details</strong> </p>
  
  <pre><code>[root@1-0-0-9 /]# uname -a
  Linux 1-0-0-9 3.10.0-229.el7.x86_64 #1 SMP Thu Jan 29 18:37:38 EST 2015 x86_64 x86_64 x86_64 GNU/Linux
  </code></pre>
  
  <p><strong>Code:</strong></p>
  
  <pre><code>#!/usr/bin/env python
  
  import os
  import subprocess
  import signal
  import time
  
  flag = False
  class Utils(object):
  
      def __init__(self):
          self.child_pid = None
          signal.signal(signal.SIGCHLD, self.sigchld_handler)
  
      def sigchld_handler(self, *args):
          print "handling SIGCHLD"
          p = self.child_pid
  
          stdout_val = p.communicate()[0]
          retcode = p.returncode
          print p.returncode, stdout_val.strip()
          self.child_pid = None
          global flag
          flag = False
  
  
      def run_command(self, cmnd, env=None, cwd=None, timeout=0):
          global flag
          flag = True
          cmnd = cmnd.split()
          self.child_pid =subprocess.Popen(cmnd, stdin=None, bufsize=-1, env=env,
                               stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
                               close_fds=True, cwd=cwd, preexec_fn=os.setsid)
          print "Invoked child process " , self.child_pid.pid
  
  print "Running command .."
  Utils().run_command("ls -lrt")
  for i in xrange(10000):
      if not i % 1000:
          print i
  print flag
  i = 0
  while flag:
      i = i + 1
  </code></pre>
  
  <p><strong>Correct (Desired) Output:</strong></p>
  
  <pre><code>Running command ..
  Invoked child process  9703
  0
  1000
  2000
  3000
  4000
  5000
  handling SIGCHLD
  0 total 52
  drwxr-xr-x.   2 root root    6 Mar 13  2014 srv
  drwxr-xr-x.   2 root root    6 Mar 13  2014 mnt
  drwxr-xr-x.   2 root root    6 Mar 13  2014 media
  drwxr-xr-x.   2 root root    6 Mar 13  2014 home
  lrwxrwxrwx.   1 root root    7 Jan  9  2016 bin -&gt; usr/bin
  lrwxrwxrwx.   1 root root    9 Jan  9  2016 lib64 -&gt; usr/lib64
  lrwxrwxrwx.   1 root root    7 Jan  9  2016 lib -&gt; usr/lib
  lrwxrwxrwx.   1 root root    8 Jan  9  2016 sbin -&gt; usr/sbin
  drwxr-xr-x.  13 root root 4096 Jan  9  2016 usr
  drwxr-xr-x.   4 root root   28 Nov 18 16:03 opt
  dr-xr-xr-x.   4 root root 4096 Nov 18 16:06 boot
  dr-xr-xr-x  178 root root    0 Nov 22 21:53 proc
  dr-xr-xr-x   13 root root    0 Nov 22 21:53 sys
  drwxr-xr-x.  22 root root 4096 Nov 22 21:53 var
  drwxr-xr-x   19 root root 3060 Nov 22 21:53 dev
  drwxr-xr-x. 124 root root 8192 Nov 22 21:53 etc
  dr-xr-x---.   8 root root 4096 Nov 22 21:53 root
  -rw-r--r--    1 root root  573 Nov 22 22:15 a.py
  -rw-r--r--    1 root root 1108 Nov 22 22:15 cmnd.py
  -rw-r--r--    1 root root 1800 Nov 22 22:15 fork.py
  -rw-r--r--    1 root root 1368 Nov 22 22:15 ipc_pipe.py
  -rw-r--r--    1 root root  491 Nov 22 22:15 threads.py
  drwxr-xr-x   35 root root 1000 Nov 22 22:35 run
  drwxrwxrwt.   8 root root 4096 Nov 22 22:35 tmp
  6000
  7000
  8000
  9000
  False
  </code></pre>
  
  <p><strong>Error (Failing case):</strong> </p>
  
  <pre><code>Running command ..
  handling SIGCHLD
  handling SIGCHLD
  handling SIGCHLD
  Traceback (most recent call last):
    File "cmnd.py", line 37, in &lt;module&gt;
      Utils().run_command("ls -lrt")
    File "cmnd.py", line 33, in run_command
      close_fds=True, cwd=cwd, preexec_fn=os.setsid)
    File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
      errread, errwrite)
    File "/usr/lib64/python2.7/subprocess.py", line 1296, in _execute_child
      data = _eintr_retry_call(os.read, errpipe_read, 1048576)
    File "/usr/lib64/python2.7/subprocess.py", line 478, in _eintr_retry_call
      return func(*args)
    File "cmnd.py", line 19, in sigchld_handler
      stdout_val = p.communicate()[0]
  AttributeError: 'NoneType' object has no attribute 'communicate'
  </code></pre>