我想创建一个包装IPython交互式shell的自定义shell。它应该拥有IPython shell所拥有的大多数东西,最重要的是,我想预处理一些自定义命令,例如" dance"或者"敲敲"在它进入它下面的IPython shell之前。
视觉上看起来应该是:
>>> print("IPython will handle this")
"IPython will handle this"
>>> dance
"I will handle this myself"
我环顾四周,尝试了几种可能做到的方法,但我真的不确定......
这是我尝试过的事情:
IPython.get_ipython()
获取交互式IPython shell的实例并使用它进行乒乓。我无法在这个上找到有用的文档。我发现的run_cell()
函数可能有用,可以执行run_cell("for i in range(10):")
之类的操作,并等待缩进的下一行。它只是抛出。Popen
打开一个IPython会话并用它打乒乓。我遵循了几个关于使用管道的教程,但我要么管道坏了,要么连线。在我深入研究之前,一定要检查我的操作系统类。我不确定这是正确的方法。我记得SageMath做了类似的事情,但不能很好地理解他们的源代码。
任何评论都会有所帮助。在此先感谢:)
答案 0 :(得分:1)
你的预处理是用Python吗?如果需要,您可以查看inputtransformers,它允许您将用户输入转换为您喜欢的任何内容。这就是魔法的工作方式。根据您希望的工作类型,有不同级别的输入转换。
请注意,如果没有变量阴影是魔法,并且您定义了一个名为dance
的魔法,那么In[1]: dance
将触发您的魔法代码而不是语法错误,它可能比定制语法变换器。在你的情况下,一个神奇的名字knock
和dance
就足够了。魔法前面的%
只有在某些情况下才能消除歧义,否则就没有必要。这就是cd
,ls
,pwd
...在IPython中工作的方式(从技术上讲,它们是别名,但技术上的区别在这里并不重要)。 Here是如何定义自定义魔法的。
如果你真的需要覆盖,你需要继承TerminalInteractiveShell,你可以告诉IPython通过this option将它与你的自定义类交换。一旦你让它与终端一起工作,就应该很容易将它变成一个内核,但这也需要与IPykernel一起玩杂耍,这会让事情变得复杂。