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