By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
439,957 Members | 1,936 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 439,957 IT Pros & Developers. It's quick & easy.

How to use subprocess

P: n/a
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
Jul 18 '05 #1
Share this Question
Share on Google+
4 Replies


P: n/a
On Tue, 22 Mar 2005 15:18:16 -0500, Nicolas Fleury
<ni******@yahoo.com_remove_the_> declaimed the following in
comp.lang.python:
Hi,
I want to use the subprocess module (or any standard Python module) to
run a process:
Pardon the question, but which version of Python /has/ a
"subprocess" module? Is it new with 2.4?

I've not installed 2.4 yet as I'm not sure I can locate
pre-built external modules for some of the stuff I currently use.

-- ================================================== ============ <
wl*****@ix.netcom.com | Wulfraed Dennis Lee Bieber KD6MOG <
wu******@dm.net | Bestiaria Support Staff <
================================================== ============ <
Home Page: <http://www.dm.net/~wulfraed/> <
Overflow Page: <http://wlfraed.home.netcom.com/> <

Jul 18 '05 #2

P: n/a
Dennis Lee Bieber wrote:
Pardon the question, but which version of Python /has/ a
"subprocess" module? Is it new with 2.4?


yes.

for earlier versions, you can get a pure-Python Unix implementation
here:

http://www.lysator.liu.se/~astrand/popen5/

and a windows installer here:

http://effbot.org/downloads/#subprocess

</F>


Jul 18 '05 #3

P: n/a
I am not sure how safe it is, but on Linux I have just copied
subprocess.py
in my 2.3 installation and it worked in all the cases I tried.

Michele Simionato

Jul 18 '05 #4

P: n/a
Nicolas Fleury <ni******@yahoo.com_remove_the_> writes:
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?


You might take a look at my asyncproc module, available at

http://www.lysator.liu.se/~bellman/d...d/asyncproc.py

Specifically the Process class. It doesn't do exactly what you
want, but maybe you can use it as inspiration for doing it yourself.

It requires the subprocess module, but I have successfully used
it under Python 2.3.2 with subprocess installed locally.
--
Thomas Bellman, Lysator Computer Club, Linköping University, Sweden
"Adde parvum parvo magnus acervus erit" ! bellman @ lysator.liu.se
(From The Mythical Man-Month) ! Make Love -- Nicht Wahr!
Jul 18 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.