使用iPython / Spyder从Python退出的问题

时间:2017-07-03 20:27:22

标签: ipython spyder

之前已经提出过这个问题,但我在this这样的相关问题中尝试过这些问题但无济于事。

我遇到了Python exit命令的问题,我已经排除了我的代码运行问题,因为我运行了iPython或Spyder&# 39; iPython控制台。

当我只使用一个简单的退出命令时,我收到错误:

NameError: name 'exit' is not defined

我已经按照其他链接的建议导入了sys。唯一有用的是尝试sys.exit(),在这种情况下我得到:

An exception has occurred, use %tb to see the full traceback.

SystemExit

C:\Users\sdewey\AppData\Local\Continuum\Anaconda3\lib\site-
packages\IPython\core\interactiveshell.py:2870: UserWarning: To exit: use 
'exit', 'quit', or Ctrl-D.
  warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

我只说那种"有点作品"因为错误信息较小,所以不那么讨厌:)。

有什么想法吗?似乎是iPython的一个问题。我在Jupyter(使用iPython)中遇到了一个不同的问题,完全忽略了quit,我单独发布了here

1 个答案:

答案 0 :(得分:4)

我在Pycharm的IPython shell中运行包含exit()的脚本时遇到了同样的问题。 我学习了here,该出口用于交互式shell,因此行为将根据shell的实现方式而有所不同。

我可以找到一个解决方案......

  • 在退出时不杀死内核
  • 不显示追溯
  • 不要强迫您使用try / excepts来巩固代码
  • 使用或不使用IPython,无需更改代码

只需从下面的代码导入'exit'到你打算用IPython运行的脚本中,并且调用'exit()'应该可行。您也可以在jupyter中使用它(而不是quit,这只是exit的另一个名称),它不会像在IPython shell中那样完全退出,让你知道...... / p>

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