Python 如何检查REPL you';重复使用?

Python 如何检查REPL you';重复使用?,python,ipython,read-eval-print-loop,bpython,ptpython,Python,Ipython,Read Eval Print Loop,Bpython,Ptpython,有很多种Python REPL,比如默认REPL、ptpython、ipython、bpython等等。当我已经在其中时,有没有办法检查当前的REPL是什么 一点背景: 正如您可能已经听说的,我制作了prettydir()printing。我面临的一个挑战是使其与那些第三方REPL兼容,但首先我需要知道程序运行的是哪个REPL。可能您最好查看sys.stdin和stdout并比较它们的类型 也许每个解释器都有办法挂接自定义完成或格式化程序。您可以尝试从调用堆栈中查找信息 这些奇特的REPL使用启

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

一点背景:

正如您可能已经听说的,我制作了pretty
dir()
printing。我面临的一个挑战是使其与那些第三方REPL兼容,但首先我需要知道程序运行的是哪个REPL。

可能您最好查看
sys.stdin
stdout
并比较它们的类型


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

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

这些奇特的REPL使用启动脚本进行初始化


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

好,最后找到了一种简单但超级可靠的方法:检查
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'

好的,所以我的问题解决了
bpython
bpython
不提供这样的检查。可能是试探性的:
sys.executable
我试过了,它显示了系统的python位置,比如
/usr/local/opt/python3/bin/python3.6
。啊。也许
sys.stdin
stdout
提供了更好的区分方法。但它们也可能被应用程序重新定义。