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】:

看起来IPythonquit/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 中的工作方式不同的主要内容,如果未能解决你的问题,请参考以下文章

IPy模块--IP地址处理

pythonIP地址处理模块IPy

运维自动化之IPy模块

Python模块学习之IPy模块

Python自动化运维:DNS域名轮循业务监控(IP地址处理模块IPy和DNS处理模块dnspython)

Python学习笔记-IP地址处理模块Ipy