Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Detect hung apps spawned from python

17 views
Skip to first unread message

David Stubbs

unread,
Jun 2, 2003, 8:55:39 AM6/2/03
to
Hi,

I have a python app that builds a list of all subdirectories from the
current directory, and then in turn runs a 'test.py' script from within each
of these directories. I currently do this using os.system(). Is there any
easy way of detecting apps that crashed, and terminating them if so? Ideally
being able to set a time-out to wait for the application to finish would be
good.

I think I could do it using CreateProcess, but, well, it just seems like
overkill and that there'll be a much simpler method somewhere.

Thanks,
Dave.


Just

unread,
Jun 2, 2003, 10:43:50 AM6/2/03
to
In article <3edb494b$0$12997$afc3...@news.easynet.co.uk>,
"David Stubbs" <da...@snsys.com> wrote:

> I have a python app that builds a list of all subdirectories from the
> current directory, and then in turn runs a 'test.py' script from within each
> of these directories. I currently do this using os.system().

Sorry for not answering your question, but have you considered
os.listdir() and os.path.isfile()?

Just

David Stubbs

unread,
Jun 2, 2003, 11:00:25 AM6/2/03
to
Sorry,

I was a bit vague. I do use os.listdir() to build up the list. I meant that
I execute a script from within each of these directories with the
os.system() call. As the call to os.system() is blocking, I'd like some way
to detect if the spawned process hangs, and if so recover control.

Does anyone know an easy way of traversing a list of python scripts,
executing each one in turn, checking the return value, and also safeguarding
against scripts that never return control back to the host script?

I'm just trying to create a simple test harness, and so far have it looking
quite good except that if one of the individual tests crash then my test
harness sits patiently waiting forever, which obviously isn't good as it
then requires user intervention.

Thank again,
Dave.

"Just" <ju...@xs4all.nl> wrote in message
news:just-8F68BC.1...@news1.news.xs4all.nl...

Just

unread,
Jun 2, 2003, 11:17:03 AM6/2/03
to
In article <3edb668b$0$13744$afc3...@news.easynet.co.uk>,
"David Stubbs" <da...@snsys.com> wrote:

> Sorry,
>
> I was a bit vague. I do use os.listdir() to build up the list. I meant that
> I execute a script from within each of these directories with the
> os.system() call. As the call to os.system() is blocking, I'd like some way
> to detect if the spawned process hangs, and if so recover control.
>
> Does anyone know an easy way of traversing a list of python scripts,
> executing each one in turn, checking the return value, and also safeguarding
> against scripts that never return control back to the host script?
>
> I'm just trying to create a simple test harness, and so far have it looking
> quite good except that if one of the individual tests crash then my test
> harness sits patiently waiting forever, which obviously isn't good as it
> then requires user intervention.

Look at the popen2.py module. Either you can use it as-is, or (depending
on your specific needs) you can use it as inspiration how to deal with
external processes.

Just

Jeff Epler

unread,
Jun 2, 2003, 10:59:02 AM6/2/03
to

As far as I know, you'll have to use the Windows-specific APIs if you
want to do something like "kill this process if it takes longer than 30
seconds". On Unix, you would use fork+exec and os.kill(), but as far as
I know these don't translate to the Windows world.

Jeff

David Stubbs

unread,
Jun 3, 2003, 8:42:46 AM6/3/03
to
Thanks for your help. I decided to go the Win32 way. Here's my solution...

---
PROCESS_STILL_RUNNING = 259
def run_script(test_dir, timeout = 2):
timeout = timeout * 60 # Convert the timeout param from minutes to
seconds
os.chdir(test_dir)
pinfo = win32process.CreateProcess(
None, 'python.exe "' + test_dir + '\\test.py"', None, None, 0, 0,
None, None, win32process.STARTUPINFO())

retval = PROCESS_STILL_RUNNING
while retval == PROCESS_STILL_RUNNING:
time.sleep(0.25)
timeout = timeout - 0.25
if timeout <= 0:
win32process.TerminateProcess(pinfo[0], 1)
print "ERROR: Process timeout"
break
retval = win32process.GetExitCodeProcess(pinfo[0])
os.chdir("..\\")
return retval
---

Regards,
Dave Stubbs.

"David Stubbs" <da...@snsys.com> wrote in message
news:3edb494b$0$12997$afc3...@news.easynet.co.uk...

0 new messages