I've decided to change the runCmdLine method to Popen. On Feb 23, 4:54 pm, aha <aquil.abdul...@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...@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 > >
-- http://mail.python.org/mailman/listinfo/python-list