如何检查您使用的 REPL 类型?
How to inspect the type of REPL you're using?
有很多种Python REPL,比如默认的REPL、ptpython、ipython、bpython等。有没有办法检查当前的REPL是什么,当我已经在里面?
一点背景知识:
正如您可能听说过的,我制作了 pdir2 以生成漂亮的 dir()
打印。我面临的一个挑战是使其与那些第三方 REPL 兼容,但首先我需要知道该程序在哪个 REPL 运行 中。
可能您能做的最好的事情就是查看 sys.stdin
和 stdout
并比较它们的类型。
也许每个解释器也有办法挂钩自定义完成或格式化程序。
您可以尝试从调用堆栈中查找信息。
那些花哨的 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'
有很多种Python REPL,比如默认的REPL、ptpython、ipython、bpython等。有没有办法检查当前的REPL是什么,当我已经在里面?
一点背景知识:
正如您可能听说过的,我制作了 pdir2 以生成漂亮的 dir()
打印。我面临的一个挑战是使其与那些第三方 REPL 兼容,但首先我需要知道该程序在哪个 REPL 运行 中。
可能您能做的最好的事情就是查看 sys.stdin
和 stdout
并比较它们的类型。
也许每个解释器也有办法挂钩自定义完成或格式化程序。
您可以尝试从调用堆栈中查找信息。
那些花哨的 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'