Don't have time to test it, but maybe a simpler approach would be to
explicitly replace the default SIGINT handler with something that
doesn't throw a KeyboardInterrupt? I believe it's possible to register
a signal handler that will intercept them asynchronously, something
like



import signal
signal.signal(signal.SIGINT, menu)

def code():
    ...

def menu():
    # raise KeyboardError
    do_useful_things_instead()

while not_done:
    x.code()



This is probably un-threadsafe in a zillion ways though, but see if it
works. I hate threads anyway.

http://docs.python.org/library/signal.html

2009/1/5 Padraig Kitterick <[email protected]>:
>
> Daniel Kersten wrote:
>> My code is something like this:
>>
>> while not_done:
>>     try:
>>         code()
>>     except keyboardinterupt:
>>         print "Menu:"
>>         print " debug    - run pdb"
>>         print " resume  - resume program"
>>         print " abort      - abort program"
>>         ...
>>         command = raw_input("> ")
>>         if command == "debug":
>>             pdb.set_trace()
>>         ...
>>
>> The idea is that code() is run in a loop executing data (in my case, a
>> single entry to a log file) and Ctrl-C pauses the program and pops up
>> a little menu. The problem is that in certain cases, code() may have
>> already altered data and breaking out and rerunning it will either 1)
>> lose data or 2) duplicate data.
>>
>> The only real solution I can think of is catching the interrupt in a
>> separate thread which sets a flag telling the main thread to run pdb,
>> or abort or whatever, but ideally, I'd like to catch the exception and
>> somehow magically resume.
>>
>>
>> 2009/1/5 Ajurna <[email protected]>:
>>
>>> hi,
>>>     it might be me and im getting this wrong but surely you could use a try:
>>> except clause?
>>>
>>> try:
>>>     codeloop()
>>> except keyboardinterupt:
>>>     mainloop()
>>>
>>>
>>> or something to that effect.
>>>
>>> On Mon, Jan 5, 2009 at 3:38 PM, Daniel Kersten <[email protected]> wrote:
>>>
>>>> Hi & happy new year,
>>>>
>>>> I'm wondering if theres anyway of resuming after a KeyboardInterrupt
>>>> exception, if I catch it. For example, can I retrieve the code object
>>>> or stack or something from when execution was interrupted and continue
>>>> from there.
>>>>
>>>> Basically, I would like to use Ctrl-C as a way to temporarily break
>>>> out of my program to enter a menu (in this particular case, the menu
>>>> allows you to quit, continue and enter pdb). This works fine in most
>>>> cases, but if I interrupt in the middle of certain operations, when I
>>>> resume, I lose data. Of course, I can write my code to avoid this, but
>>>> that may not always be possible.
>>>>
>>>> Any ideas? Or do I need to handle the menu in a separate thread..?
>>>>
>>>> Thanks!
>>>> Dan.
>>>>
>>>> --
>>>> Daniel Kersten.
>>>> Leveraging dynamic paradigms since the synergies of 1985.
>>>>
>>>>
>>>>
>>>
>>> --
>>> ~Ajurna
>>>
>>>
>>
>>
>>
>>
> AFAIK this isn't really possible to do in Python [1], as it doesn't have
> the ability to restart after an exception is raised, such as is possible
> in LISP [2]. You can try to constantly store the current state of all
> objects to implement a support for a kind of resume, but that would mean
> altering any code extensively.
>
> [1] http://mail.python.org/pipermail/python-list/2005-June/327048.html
> [2]
> http://www.gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html
>
> >
>



-- 
steev
http://www.daikaiju.org.uk/~steve/

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Python Ireland" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.ie/group/pythonireland?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to