How to use subprocess

Nicolas Fleury nid_oizo at yahoo.com_remove_the_
Tue Mar 22 15:18:16 EST 2005


Hi,
	I want to use the subprocess module (or any standard Python module) to 
run a process:
- which stdout and stderr can each be redirected to any file-like object 
(no fileno function).
- can be cancelled with a threading.Event.

My problem is that the subprocess.Popen constructor doesn't seem to 
support file-like objects (only file objects with fileno()).

If I use subprocess.PIPE, I have the problem that the read functions of 
of the subprocess objects stdout and stderr are blocking (and I want to 
redirect them to different file-like objects, so I definitely need 
non-blocking access).  How am I supposed to do it?

Thx and regards,
Nicolas

It something like that that I would need to make work (but supporting 
file-like objects):

class CancellationException(Exception): pass
class CancellableCommand:
     def __init__(self, command, stdout=nullFile, stderr=nullFile,
                  refreshDelay=0.1, raiseIfNonZero=True):
         self.command = command
         self.stdout = stdout
         self.stderr = stderr
         self.refreshDelay = refreshDelay
     def execute(self, cancelEvent=None):
         if cancelEvent is None:
             cancelEvent = threading.Event()  # dummy
         exitCode = None
         cmd = subprocess.Popen(
             self.command, stdout=self.stdout, stderr=self.stderr)
         while exitCode is None:
             # Wait for event to be set for a specific delay
             cancelEvent.wait(self.refreshDelay)
             if cancelEvent.isSet():
                 kill(cmd.pid)  # implemented as in FAQ
                 raise CancellationException(
                     'Process "' + self.command + '" cancelled')
             exitCode = cmd.poll()
         return exitCode



More information about the Python-list mailing list