subprocess: returncode v. poll()

7stud bbxx789_05ss at yahoo.com
Fri Sep 21 03:50:21 EDT 2007


On Sep 20, 3:24 pm, David <wizza... at gmail.com> wrote:
> On 9/20/07, 7stud <bbxx789_0... at yahoo.com> wrote:
>
>
>
> > On Sep 20, 1:25 pm, 7stud <bbxx789_0... at yahoo.com> wrote:
> > > On Sep 20, 1:17 pm, 7stud <bbxx789_0... at yahoo.com> wrote:
>
> > > > Hi,
>
> > > > What is the difference between:
>
> > > > 1) getting the returncode directly from the subprocess object
> > > > 2) calling poll() on the subprocess object?
>
> > > > Here is an example:
>
> > > > import subprocess
>
> > > > p = subprocess.Popen("ls", stdout=subprocess.PIPE)
> > > > print p.returncode
> > > > print p.poll()
> > > > print
>
> > > > print p.stdout.read()[:5]
> > > > print
>
> > > > print p.returncode
> > > > print p.poll()
> > > > print p.returncode
>
> > > > --output:--
> > > > None
> > > > None
>
> > > > 10tes
>
> > > > None
> > > > 0
> > > > 0
>
> > > Hmm....after a little more testing, I don't think returncode
> > > dynamically updates:
>
> > > import subprocess
> > > import time
>
> > > p = subprocess.Popen("ls", stdout=subprocess.PIPE)
>
> > > print p.returncode
> > > time.sleep(5)
> > > print p.returncode
> > > time.sleep(2)
> > > print p.returncode
>
> > > print p.stdout.read()[:5]
> > > print p.returncode
>
> > > --output:--
> > > None
> > > None
> > > None
> > > 10tes
> > > None
>
> > ...but then when is p.returncode set?  And what good is it?
>
> AFAICT p.returncode is only set by Popen methods. It doesn't
> automatically get set by the OS internals that manage the actual
> process.
>
> One place where it is useful is when using Popen's communicate()
> method, which returns (stdout,stderr), but not the return code. Also
> it lets you call poll() but not have to save poll()'s return value.

I didn't understand your post when I first read it, but after looking
at my output again, and rereading your post, I get it now.  In case
someone else doesn't understand it:  returncode is not set by the
child process--ever.  return code starts off with a default value of
None, and it remains None until you call a method in the subprocess
module, like poll() or wait().  Those methods set and then return
returncode.  As a result, if you want to know what the status of the
child process is, you have to call either poll() or wait().




More information about the Python-list mailing list