problems exiting from Python using iPython/Spyder

后端 未结 1 1884
礼貌的吻别
礼貌的吻别 2021-01-21 00:52

This question has been asked before, but I have tried the solutions in related questions such as this to no avail.

I am having problems with Python\'s exit

相关标签:
1条回答
  • 2021-01-21 01:19

    I've run into the same issue while running scripts containing exit() in Pycharm's IPython shell. I learned here, that exit is intended for interactive shells, so behaviour will vary depending on how the shell implements it.

    I could figure out a solution which would...

    • not kill the kernel on exit
    • not display a traceback
    • not force you to entrench code with try/excepts
    • work with or without IPython, without changes in code

    Just import 'exit' from the code beneath into scripts you also intend to run with IPython and calling 'exit()' should work. You can use it in jupyter as well (instead of quit, which is just another name for exit), where it doesn't exit quite as silent as in the IPython shell, by letting you know that...

    An exception has occurred, use %tb to see the full traceback.
    
    IpyExit
    
    """
    # ipython_exit.py
    Allows exit() to work if script is invoked with IPython without
    raising NameError Exception. Keeps kernel alive.
    
    Use: import variable 'exit' in target script with 'from ipython_exit import exit'    
    """
    
    import sys
    from io import StringIO
    from IPython import get_ipython
    
    
    class IpyExit(SystemExit):
        """Exit Exception for IPython.
    
        Exception temporarily redirects stderr to buffer.
        """
        def __init__(self):
            # print("exiting")  # optionally print some message to stdout, too
            # ... or do other stuff before exit
            sys.stderr = StringIO()
    
        def __del__(self):
            sys.stderr.close()
            sys.stderr = sys.__stderr__  # restore from backup
    
    
    def ipy_exit():
        raise IpyExit
    
    
    if get_ipython():    # ...run with IPython
        exit = ipy_exit  # rebind to custom exit
    else:
        exit = exit      # just make exit importable
    
    0 讨论(0)
提交回复
热议问题