A tale of two execs

aha aquil.abdullah at gmail.com
Mon Feb 23 23:20:04 CET 2009


I've decided to change the runCmdLine method to Popen.
On Feb 23, 4:54 pm, aha <aquil.abdul... at gmail.com> wrote:
> Hello All,
>   So below is my naive attempt at the wrapper, it is only half baked
> since I am no master at Interprocess communication... I know that it
> is lacking a lot of things comment greatly appreciated:
>
> #!/usr/bin/env python
>
> import os, sys, re, exceptions
> try:
>     import subprocess
> except ImportError:
>     import popen2
>     subprocess = None
>
> PIPE = 10
> SOUT = 11
>
> class Runner:
>     def __init__(self):
>         self.stdout = None
>         self.stdin = None
>         self.stderr = None
>         self.pid = None
>         self.process = None
>
>     def runCmdLine(self, args, executable=None, stdin=None,
> stdout=None, stderr=None, preexec_fn=None,
>                    close_fds=False, shell=False,cwd=None, env=None):
>         """
>         args -- a string, or a sequence of program arguments. The
> argument to execute is
>         normally the first item in the args sequence or the string if
> a string is given,
>         but can be explicitly set by using the executable argument.
>
>         executable -- string to be executed
>
>         stdin, stdout, stderr -- value of standard input, standard
> output, and standard
>         error file handles.  None implies no redirection. Valid values
> are PIPE, an existing
>         file descriptor (a positive integer), an existing file object,
> and None.
>
>         shell -- specifies whether command should be executed through
> shell
>
>         cwd -- specifies whether, childs current directory will be
> changed to cwd
>
>         env -- A map that specifies the environment variables in child
> process
>         that will be overwritten
>
>         NOTE: Depending on the modules available, some arguments may
> not be used.
>         """
>         if subprocess:
>             # Use subprocess to exec functions
>             if stdin == PIPE:
>                 sin = subprocess.PIPE
>             else:
>                 # NOTE: User may input invalid values that will cause
> exceptions
>                 sin = stdin
>             if stdout == PIPE:
>                 sout = subprocess.PIPE
>             else:
>                 sout = stdout
>             if stderr == SOUT:
>                 serr = subprocess.STDOUT
>             else:
>                 serr = stderr
>
>             self.process = subprocess.Popen(args, stdin=sin,
> stdout=sout, stderr=serr,
>
> preexec_fn=preexec_fn,close_fds=close_fds, shell=shell,
>                                             env=env, cwd=cwd)
>             self.pid = self.process.pid
>            # Add attributes stdin, stdout, and stderr
>             self.stdin = self.process.stdin
>             self.stdout = self.process.stdout
>             self.stderr = self.process.stderr
>         else:
>             # Use popen2 to exec functions
>             # Determine which form of popen2 to use
>             if stderr == SOUT or stderr == None:
>                 self.process =  popen2.Popen4(args)
>                 self.stdin = self.process.tochild
>                 self.stdout = self.process.fromchild
>                 self.stderr = None
>             else:
>                 self.process =  popen2.Popen3(args)
>                 self.stdin = self.process.tochild
>                 self.stdout = self.process.fromchild
>                 self.stderr = self.process.childerr
>
>             self.pid = self.process.pid
>
>     def wait(self,):
>         """
>         Waits for and returns the status code of the child process.
>         """
>         return self.process.wait()
>
>     def poll(self,):
>         """
>         Returns -1 if the child process hasn't completed yet, or it's
> return code
>         otherwise
>         """
>         return self.process.poll()
>
> Aquil
>
> On Feb 23, 2:10 pm, Christian Heimes <li... at cheimes.de> wrote:
>
> > aha wrote
>
> > > def runner(cmd, stdin, stdout, ...):
> > >   try:
> > >     import subprocess
> > >     sbm = 1
> > >   except:
> > >     sbm = 0
>
> > >   # Now do something
> > >   if sbm:
> > >     process = subporcess(...)
> > >   else:
> > >     import popen2
> > >     process = popen2.Popen4(...)
>
> > > Has anyone else run into a situation similar to this one?
>
> > The canonical way for your try/except clause is:
>
> > try:
> >     import subprocess
> > except ImportError:
> >     subprocess = None
>
> > ...
>
> > if subprocess is not None:
> >     ...
> > else:
> >     ...
>
> > Christian
>
>




More information about the Python-list mailing list