我想创建一个环绕 IPython 交互式 shell 的自定义 shell。它应该具有 IPython shell 所具有的大部分功能,除此之外,我想在它进入其下方的 IPython shell 之前预处理一些自定义命令,例如“dance”或“knock knock”。
视觉上应该是这样的:
>>> print("IPython will handle this")
"IPython will handle this"
>>> dance
"I will handle this myself"
我环顾四周并尝试了几种可能的方法,但我真的不确定......
这是我尝试过的事情:
- 子类 IPython.kernel 或类似的东西。它似乎比我需要的更复杂,而且我已经尝试过但没有成功(无法真正理解它在做什么......)
- 使用
IPython.get_ipython()
获取交互式 IPython shell 的实例并与其进行乒乓球。我真的找不到关于这个的有用文档。我发现可能有用的run_cell()
函数不能执行run_cell("for i in range(10):")
之类的操作并等待缩进的 next线。它只是抛出。 - 使用
Popen
打开一个IPython session 并与它进行乒乓球。我遵循了一些关于使用管道的教程,但我要么管道坏了要么有线。在我深入研究之前,绝对需要复习我的操作系统类(class)。
我不太确定正确的方法是什么。我记得 SageMath 做类似的事情,但不能真正理解他们的源代码。
任何评论都会有所帮助。提前致谢:)
最佳答案
您的预处理是用 Python 进行的吗?如果是这样你想看看inputtransformers ,它允许您将用户输入转换为您喜欢的任何内容。这就是魔法的运作方式。根据你想做的工作类型,有不同级别的输入转换。
请注意,如果没有变量隐藏一个魔法,并且您定义了一个名为dance
的魔法,那么In[1]: dance
将触发您的魔法的代码而不是语法错误,它可能比自定义语法转换器更容易。在你的情况下,一个神奇的名字 knock
和 dance
应该就足够了。 magics 前面的 %
只是在某些情况下需要消除歧义,否则是不必要的。这就是 cd
, ls
, pwd
... 在 IPython 中的工作方式(从技术上讲,它们是别名,但技术上的区别在这里无关紧要) ). Here是如何定义自定义魔法。
如果真的要覆盖,需要子类TerminalInteractiveShell , 你可以通过 this option 告诉 IPython 将它与你的自定义类交换.一旦你让它与终端一起工作,将它变成内核应该很容易,但这也需要使用 IPykernel 来处理,这使得第一步变得复杂。
关于python - 如何编写 IPython shell 的包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46031501/