ipython TerminalInteractiveShell 和 InteractiveShell 有什么区别?

What is the difference between ipython TerminalInteractiveShell and InteractiveShell?

ipython documentation 有一长串可配置选项。一些用于 TerminalInteractiveShell,一些用于 InteractiveShell。当我从命令行生成 ipython_config.py 时,一些选项出现在文档中的一个选项和另一个选项中。这有什么韵律或理由吗?两者兼而有之的原因是什么?

查看文档中的list of modules,我们有

IPython.core.application: An application for IPython.

IPython.core.interactiveshell: Main IPython class.

IPython.terminal.ipapp: The Application object for the command line ipython program.

IPython.terminal.interactiveshell: IPython terminal interface using prompt_toolkit

InteractiveShell is the base iPython shell class, which can be subclassed for different purposes. TerminalInteractiveShell 就是这样一个特定的子class。它继承自 InteractiveShell,并且是当我们在命令行中键入“ipython”时运行的特定 shell。

可用于 TerminalInteractiveShell 不适用于 基础 InteractiveShell 的配置选项的一个示例是 confirm_exit。这似乎是合理的,因为“你真的想退出吗”问题只有在 shell.

中有人按下 Control-D 时才真正相关

实际上,如果您只是尝试配置命令行 ipython shell,更改选项的 InteractiveShellTerminalInteractiveShell 版本会起作用,因为TerminalInteractiveShell 继承基础 class 的选项。但是,只编辑更具体的 TerminalInteractiveShell 更安全,因为基础 class 仍在非终端情况下使用,并且更改其设置可能会导致那里出现意外行为。例如:

  • This Jupyter Notebook tutorial 使用 InteractiveShell 将笔记本代码单元转换为可执行文件 Python

  • This test class 在 ipython 源代码中为每个测试创建一个 shell(继承自普通 InteractiveShell)。

希望对您有所帮助!