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

problems exiting from Python using iPython/Spyder

以前有人问过这个问题,但我在这类相关问题上尝试过解决办法,但都无济于事。

我在使用python的exit命令时遇到了问题,并且排除了使用普通python 3运行的代码的问题。当我使用ipython或Spyder的ipython控制台运行它时,问题就出现了。

当我只使用一个简单的exit命令时,我会得到错误:

1
NameError: name 'exit' is not defined

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

1
2
3
4
5
6
7
8
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)

我只说"有点效果",因为错误消息较小,所以不那么烦人。

有什么想法吗?似乎是伊普生的问题。我在Jupyter(使用ipython)遇到了另一个问题,完全忽略了戒烟,我在这里单独发布了这个问题。


在pycharm的ipython shell中运行包含exit()的脚本时,我遇到了同样的问题。我在这里了解到,出口是为交互式shell设计的,因此行为将根据shell实现它的方式而变化。

我可以想出一个解决办法…

  • 退出时不杀死内核
  • 不显示回溯
  • 不强制您使用try/exceptions来巩固代码
  • 使用或不使用ipython,不更改代码

只需将下面的代码中的"exit"导入到您还打算用ipython运行的脚本中,调用"exit()"就可以了。你也可以在jupyter中使用它(而不是quit,这只是出口的另一个名字),在那里,它不会像ipython外壳那样安静地出口,让你知道…

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

IpyExit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
"""
# 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