如何检查您使用的 REPL 类型?

How to inspect the type of REPL you're using?

有很多种Python REPL,比如默认的REPL、ptpython、ipython、bpython等。有没有办法检查当前的REPL是什么,当我已经在里面?

一点背景知识:
正如您可能听说过的,我制作了 pdir2 以生成漂亮的 dir() 打印。我面临的一个挑战是使其与那些第三方 REPL 兼容,但首先我需要知道该程序在哪个 REPL 运行 中。

可能您能做的最好的事情就是查看 sys.stdinstdout 并比较它们的类型。

也许每个解释器也有办法挂钩自定义完成或格式化程序。

您可以尝试从调用堆栈中查找信息。

那些花哨的 REPL 使用它们的启动脚本进行初始化。

可以运行一个REPL在另一个REPL中,所以你需要从上到下遍历调用堆栈,直到从REPL初始化脚本中找到一个帧。

好的,终于找到了一个简单但超级可靠的方法:检查sys.modules

您可以复制和使用的功能。

import sys

def get_repl_type():
    if any('ptpython' in key for key in sys.modules):
        return 'PTPYTHON'
    if any('bpython' in key for key in sys.modules):
        return 'BPYTHON'
    try:
        __IPYTHON__
        return 'IPYTHON'
    except NameError:
        return 'PYTHON'