quit() 在 Python-3.x 和 IPython 中的工作方式不同
Posted
技术标签:
【中文标题】quit() 在 Python-3.x 和 IPython 中的工作方式不同【英文标题】:quit() works differently in Python-3.x and IPython 【发布时间】:2017-04-21 19:43:05 【问题描述】:内置函数 quit()
在 Python-3.x 和 IPython 3 中的行为不同。如果在 IPython 中执行,以下代码将打印 Hello
,但在 Python 中不会打印任何内容:
quit()
print("Hello")
quit()
在 IPython 中的用途是什么?改变其行为的原因是什么?
【问题讨论】:
是为了退出翻译会话...?这对我行得通。无论如何,说普通交互式 Python 解释器 REPL 和 IPython 之间的区别可能更准确。 IPython 与 Python 3.x 没有区别...无论如何,您实际上是在使用ipython
运行脚本吗? quit
函数只是用于退出 python shell 会话,无论如何都不应该在脚本中使用。
@juanpa.arrivillaga 由于打印了“Hello”,IPython 中的显然 quit() 并没有真正退出解释器——至少不是立即退出。
如果您在解释器 shell 会话 中,它会这样做,这就是它的本意。这可能是一个松散的结局,因为没有人认为您会在交互式提示之外使用 quit
。
如果我在 shell 中输入 quit();print(10)
,它仍然会在退出前打印 10。
好吧,ShadowRanger 调查了它并发布了一个看起来很完整的答案。反正quit
不是内置函数。
【参考方案1】:
看起来IPython
的quit
/exit
"function" 简化为只是设置一个标志来表示"你应该在下次检查时退出"。它本身不会引发SystemExit
,因此它可能依赖于间歇性检查,如果您同时将两个命令排队,则在第二个命令完成之前不会执行。
您可以在 IPython 提示符下自行检查,首先运行 quit??
以查看它是一个可调用类,其 __call__
委托给 self._ip.ask_exit()
。接下来,运行quit._ip.ask_exit??
,您会看到ask_exit
只是设置了一个标志self.exit_now = True
(如果您检查它,它是一个普通属性,而不是隐藏代码执行的property
)。
欢迎您追踪IPython
在哪里检查;我猜它是在IPython
的任何给定行或单元格完成后完成的。
从根本上说,区别在于 IPython 中的 quit
与常规 Python 交互式解释器中的 quit
不同; quit
/exit
作为内置的,旨在替换为替代交互式解释器,并且不需要完全相同。如果你想要一个一致的退出行为,import sys
并运行 sys.exit()
,这也是在脚本中提前退出的正确方法,而不是作为交互式提示的钩子。
【讨论】:
quit
甚至都不是内置的。
我上面说的是:docs.python.org/3/library/constants.html
@juanpa.arrivillaga:有点像。它是一个特殊的 Quitter
类的实例,它看起来是用 Python 实现的(它有一些有用的附加功能,例如 repr
,它会提醒您在键入 quit
并忘记调用它时需要添加括号)。它是一个内置的,只是因为它附带核心 Python,而不是 CPython 解释器核心或 __builtins__
的 C 级实现或任何东西的实际部分,它只是被 site
推入 __builtins__
启动包(从技术上讲,site
自动导入可以被禁用,尽管很少这样做)。以上是关于quit() 在 Python-3.x 和 IPython 中的工作方式不同的主要内容,如果未能解决你的问题,请参考以下文章