Python deadlock using subprocess.popen and communicate

Roy Smith roy at panix.com
Wed Sep 21 23:32:19 EDT 2011


In article 
<098f3d78-85f5-44e7-ba72-f2270a24d1b0 at o9g2000vbo.googlegroups.com>,
 Atherun <atherun at gmail.com> wrote:

> This is on windows with python 2.6.
> I can't seem to remove a possibility of a  deadlock in one of my
> scripts at the moment.  Its not a constant deadlock but it appears
> from time to time.  The code is below:
> 
> try:
> 
>         process =
> subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
> 
>         NotDone = True
>         data = []
>         while NotDone:
>             NotDone = False
> 
>             result = process.poll()
>             if result == None:
>                 NotDone = True
>             if NotDone:
>                 out, err = process.communicate()
>                 Log(out)
> 
> I was able to get the program to write out the stack trace for my
> threads and it is usually deadlocked on sys.stdout.read or
> _internal_poll of subproceess.
> 
> I've even tried the above, with using "with
> tempfile.NamedTemporaryFiles() as buff:" and writing to the file, but
> it still deadlocks.  In the past I work around this by running fewer
> processes asynchronously but I would really like to get this solved so
> I don't have to wait to see if it'll be caused with any changes I
> make.
> 
> Any tips would be appreciated.

My reading of the docs 
(http://docs.python.org/release/2.6.7/library/subprocess.html#popen-objec
ts) says that Popen.poll() doesn't return a value, it sets the object's 
return code attribute, which you can then interrogate.

More than that, your loop logic looks amazingly complicated for what's 
basically a simple thing.  I suggest something along the lines of:

   # assuming process.returncode is initially None 
   while process.returncode is None:
      out, err = process.communicate()
      Log(out)

I haven't tested that, but I think (from reading the docs) that's the 
right idea.



More information about the Python-list mailing list