How to prevent a process from terminating on a KeyboardInterrupt?
Question: I've been messing around with a Django project. What I want to achieve is the
Django project starting up in another process while the parent process
initiates a load of arbitary code I have written (the backend of my project).
Obviously, the Django process and parent processes communicate. I'd like a
dictionary to be read and written to by the processes.

I have the following code, based upon examples from
[here](http://docs.python.org/library/multiprocessing.html#sharing-state-
between-processes):

    
    
    #!/usr/bin/env python
    
    from multiprocessing import Process, Manager
    import os
    import time
    from dj import manage
    
    def django(d, l):
        print "starting django"
    
        d[1] = '1'
        d['2'] = 2
        d[0.25] = None
        l.reverse()
        manage.start()
    
    def stop(d, l):
    
        print "stopping"
        print d
        print l
    
    if (__name__ == '__main__'):
        os.system('clear')
        print "starting backend..."
        time.sleep(1)
        print "backend start complete."
    
        manager = Manager()
    
        d = manager.dict()
        l = manager.list(range(10))
    
        p = Process(target=django, args=(d, l))
        p.start()
    
        try:
            p.join()
        except KeyboardInterrupt:
            print "interrupt detected"
    
        stop(d, l)
    

When I hit CTRL+C to kill the Django process, I'm seeing the Django server
shut down, and `stop()` being called. Then what I want to see is the
dictionary, `d`, and list, `l`, being printed.

Output is:

    
    
    starting backend...
    backend start complete.
    starting django
    Validating models...
    
    0 errors found
    Django version 1.3, using settings 'dj.settings'
    Development server is running at http://127.0.0.1:8000/
    Quit the server with CONTROL-C.
    ^Cinterrupt detected
    stopping
    <DictProxy object, typeid 'dict' at 0x141ae10; '__str__()' failed>
    <ListProxy object, typeid 'list' at 0x1425090; '__str__()' failed>
    

It can't find the dictionary or list after the CTRL+C event. Has the Manager
process been terminated when the SIGINT is issued? If it is, is there anyway
to stop it from terminating there and terminating with the main process?

I hope this makes sense. Any help greatly receieved.


Answer: Ok, as far I see no possibility to simply ignore exception. When you rise one,
you always go straight into a "except" block if there is one. What I'm
proposing here is something what will restart your django application on each
^C, but note, that there should be added some back door for leaving.

In theory, you can wrap each line with a `try..except..` block and that would
act like a restart of each line, what will not be as visible as restart of
whole script. If anyone finds a really-working solution, I will be the first
one to upvote him.

You can set all inside your `if (__name__ == '__main__'):` into o `main`
function and leave something like this:

    
    
    def main():
        #all the code...
    
    if (__name__ == '__main__'):
        while True:
            try:
                main()
            except KeyboardInterrupt:
                pass
    

