如何编写IPython shell的包装器?

时间:2017-09-04 06:36:47

标签: python linux shell ipython

我想创建一个包装IPython交互式shell的自定义shell。它应该拥有IPython shell所拥有的大多数东西,最重要的是,我想预处理一些自定义命令,例如" dance"或者"敲敲"在它进入它下面的IPython shell之前。

视觉上看起来应该是:

>>> print("IPython will handle this")
"IPython will handle this"
>>> dance
"I will handle this myself"

我环顾四周,尝试了几种可能做到的方法,但我真的不确定......

这是我尝试过的事情:

  1. 子类IPython.kernel或类似的东西。这似乎更复杂,我需要并且我没有成功地尝试过它(不能真正理解它在做什么......)
  2. 使用IPython.get_ipython()获取交互式IPython shell的实例并使用它进行乒乓。我无法在这个上找到有用的文档。我发现的run_cell()函数可能有用,可以执行run_cell("for i in range(10):")之类的操作,并等待缩进的下一行。它只是抛出。
  3. 使用Popen打开一个IPython会话并用它打乒乓。我遵循了几个关于使用管道的教程,但我要么管道坏了,要么连线。在我深入研究之前,一定要检查我的操作系统类。
  4. 我不确定这是正确的方法。我记得SageMath做了类似的事情,但不能很好地理解他们的源代码。

    任何评论都会有所帮助。在此先感谢:)

1 个答案:

答案 0 :(得分:1)

你的预处理是用Python吗?如果需要,您可以查看inputtransformers,它允许您将用户输入转换为您喜欢的任何内容。这就是魔法的工作方式。根据您希望的工作类型,有不同级别的输入转换。

请注意,如果没有变量阴影是魔法,并且您定义了一个名为dance的魔法,那么In[1]: dance将触发您的魔法代码而不是语法错误,它可能比定制语法变换器。在你的情况下,一个神奇的名字knockdance就足够了。魔法前面的%只有在某些情况下才能消除歧义,否则就没有必要。这就是cdlspwd ...在IPython中工作的方式(从技术上讲,它们是别名,但技术上的区别在这里并不重要)。 Here是如何定义自定义魔法的。

如果你真的需要覆盖,你需要继承TerminalInteractiveShell,你可以告诉IPython通过this option将它与你的自定义类交换。一旦你让它与终端一起工作,就应该很容易将它变成一个内核,但这也需要与IPykernel一起玩杂耍,这会让事情变得复杂。