subprocess vs. proctools

Nick Craig-Wood nick at craig-wood.com
Wed Dec 15 08:30:01 EST 2004


Keith Dart <kdart at kdart.com> wrote:
>  Nick Craig-Wood wrote:
> > This sounds rather like the new subprocess module...
> > 
> >>>>import subprocess
> >>>>rc = subprocess.call(["ls", "-l"])
> > 
> > total 381896
> > -rw-r--r--    1 ncw ncw      1542 Oct 12 17:55 1
> > [snip]
> > -rw-r--r--    1 ncw ncw       713 Nov 16 08:18 z~
> > 
> >>>>print rc
> > 
> > 0
> 
>  But this evaluates to False in Python, but True in a shell.

There are many ways for a program to fail (non-zero exit codes) but
only one way for it to succeed (zero exit code).  Therefore rc should
be 0 for success.

IMHO Shell semantics are nuts (0 is True - yeah!) - they hurt my head
every time I have to use them ;-)

>  It also requires an extra check for normal exit, or exit by a
>  signal.

>>> import subprocess
>>> subprocess.call(["sleep", "60"])
-11
>>> 
# I killed the sleep process with a SEGV here from another xterm

>>> subprocess.call(["sleep", "asdfasdf"])
sleep: invalid time interval `asdfasdf'
Try `sleep --help' for more information.
1
>>>

Signals are -ve, exit codes are +ve which seems perfect.  Exit codes
can only be from 0..255 under linux.  Signals go from -1 to -64.

>  The proctools ExitStatus object avaluates to True only on a normal
>  exit, period. Thus it follows a shell semantics for clarity. You
>  cannot do this with the subprocess module:
> 
>  if rc:
>       print "exited normally"

Actually I think

if rc == 0:
     print "exited normally"

is exactly equivalent!

[snip]
>  It does not work with MS Windows

I like python because I can write stuff on linux and it works on
windows without too much effort, and in general I try not to use
modules which don't work on both platforms.

-- 
Nick Craig-Wood <nick at craig-wood.com> -- http://www.craig-wood.com/nick



More information about the Python-list mailing list