Interrupting Python
Bengt Richter
bokr at oz.net
Sat Sep 7 13:48:11 EDT 2002
On Sat, 7 Sep 2002 06:32:24 -0400, "Bob Easton" <bob at eleaston.com> wrote:
>Yes Peter, it makes sense that PythonWin works that way by design. You are
>also right about running from the command prompt after development/debug is
>done.
>
>For this particular program, using a file semaphore is ideal since I can
>place it at the right point in the program to enable easy restart, something
>not easily done with the random ctrl-break.
You can place a test for Ctrl-C and/or Ctrl-Break at "the right point"(s)
in your program. See below.
>
>Thanks to all who helped clear the fog for me.
>
>--
>Bob Easton
>
>
>"Peter Hansen" <peter at engcorp.com> wrote in message
>news:3d796d22 at news.sentex.net...
>> Bob Easton wrote:
>> > Using catchCtlC.py in a command line environment works as you expect.
>When I
>> > hit Ctrl-Break, Windows displays "^C" and then a command prompt. If I
>hit
>> > Ctrl-C, the exception handler catches it and displays the results as
>> > specified in catchCtlC/py
>> >
>> > However, my preferred execution environment is PythonWin, not a command
>> > prompt. There, neither Ctrl-break, not Ctrl-C have any effect. That
>could
>> > easily be a bug with PythonWin.
>>
>> Not a bug, I think. The whole Ctrl-C/Ctrl-Break concept is only
>> meaningful for command-line ("console") programs, not GUI apps.
>> I don't use PythonWin, but my guess is it does not bother passing
>> ctrl-c on to the application, possibly by design.
>>
>> Can't you just run it under the console? What advantages do
>> you find by running it under PythonWin other than during
>> development?
>>
>> Also, have you looked at the msvcrt module and kbhit() ?
>>
>> -Peter
>>
>
---< interruptpy.py >------
#!/usr/bin/python
def test():
import sys, signal
class SigHandler:
def __init__(self):
self.signaled = 0
self.sn=None
def __call__(self, sn, sf):
self.sn = sn
self.signaled += 1
sh = SigHandler()
old_SIGINT_Handler = signal.signal(signal.SIGINT,sh)
old_SIGBREAK_Handler = signal.signal(signal.SIGBREAK,sh)
signames = {
signal.SIGINT:'SIGINT',
signal.SIGBREAK:'SIGBREAK'
}
print 'Type Ctrl-C or Ctrl-Break to stop'
while not sh.signaled: # put this condition in your program loop
pass # (loop body)
print 'Interrupted loop with %s (not via exception).' % signames[sh.sn]
signal.signal(signal.SIGINT,old_SIGINT_Handler)
signal.signal(signal.SIGBREAK,old_SIGBREAK_Handler)
if __name__ == '__main__':
test()
---------------------------
>>> from interruptpy import test
>>> test()
Type Ctrl-C or Ctrl-Break to stop
Interrupted loop with SIGINT (not via exception).
>>> test() # now I'll do ctrl-break
Type Ctrl-C or Ctrl-Break to stop
Interrupted loop with SIGBREAK (not via exception).
>>> ^Z
[10:55] C:\pywk\pi>interruptpy.py
Type Ctrl-C or Ctrl-Break to stop
Interrupted loop with SIGINT (not via exception).
[10:55] C:\pywk\pi>interruptpy.py
Type Ctrl-C or Ctrl-Break to stop
Interrupted loop with SIGBREAK (not via exception).
Obviously you could sprinkle various tests of sh.signaled
into various parts of your code, to check-point variously.
You could resond differently to Ctrl-C vs Ctrl-Break also.
The above is on NT4 Python 2.2 BTW.
BTW2, I suspect I am not the only one who will appreciate it
if you decide to adopt usual ng conventions, and discontinue
top-posting. Consider it a virtual beer for those who paid
attention to your posts anyway ;-)
Regards,
Bengt Richter
More information about the Python-list
mailing list