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