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 -- http://mail.python.org/mailman/listinfo/python-list