python - 覆盖 REPL 输出

标签 python ipython stdout read-eval-print-loop

我正在寻找一种方法来覆盖和解析 Python REPL 中的所有输出:例如终端、qtconsole 中的 python/IPython。

通过覆盖打印函数,这对于打印文本来说很简单。举一个简单的例子,假设我们想在所有输出中添加一个感叹号:

orig_print = print
print = lambda text: orig_print(text + '!')

现在所有打印命令都会添加感叹号。这可以通过以下方式重置:

del print

我的问题:如何对 REPL 输出执行等效操作?例如,我怎样才能使它起作用?

In[1]: 5 + 5
Out[2]: 10!

搜索引导我沿着 contextlib、subprocess 和 sys.stdout 的路径走下去,但我还没有找到解决方案。在Github上检查了sympy的打印模块,没有成功。

最佳答案

我刚刚尝试覆盖sys.stdout.write并且它起作用了(有一些怪癖)。如果我错了,有人会纠正我,但我认为不会有比这更好的了。

In [1]: import sys

In [2]: tmp = sys.stdout.write

In [3]: sys.stdout.write = lambda text: tmp(text + '!')

In [4]: 5 + 5
!Out[4]: 10!
!!
!!In [5]:

编辑:
我已经走到这一步了。还没弄清楚那 1 个额外的 ! 从哪里来。

In [5]: sys.stdout.write = lambda text: tmp(text if text.endswith('\n') else text + '!\r')

In [6]: 5+5
Out[6]: 10!
!
In [7]:

关于python - 覆盖 REPL 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47866783/

相关文章:

python - 使用jq正确解析数据

python - 为python安装django模块时出错

python - 使用python Paypal REST SDK在django中动态获取付款和付款人ID

python - Jupyter 数据路径是否支持 unicode?

linux - 如何仅在命令完成时输出

python - 如何从 Google App Engine 数据存储区查询中订购引用的对象?

python - 我正在尝试安装 ipython 但出现权限错误

ipython - IPython 魔法是如何工作的

fortran - Fortran 90 中的标准输入和输出单位?

python - Grep python 输出流(尝试打印和标准输出)