N
Nicolas Fleury
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
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