2017-09-04 74 views
0

我想创建一个封装IPython交互式shell的自定义shell。它应该具有IPython shell的大部分功能,除此之外,我还想在它进入IPython shell之前预先处理一些自定义命令,如“dance”或“knock knock”。如何编写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外壳的实例和乒乓球与它。我找不到有用的文档。我找到的run_cell()函数可能有用,但不能执行run_cell("for i in range(10):")之类的操作,并等待缩进的下一行。它只是抛出。
  3. 使用Popen打开IPython会话并与之乒乓。我遵循了几个关于使用管道的教程,但是我要么弄坏管道,要么接线。在深入研究之前,肯定需要查看我的操作系统类。

我不太确定什么是正确的方法。我记得SageMath做类似的事情,但不能很好地理解他们的源代码。

任何意见将有所帮助。在此先感谢:)

回答

1

是你在Python预处理?如果是这样,你想看看inputtransformers,它允许你将用户输入转换成你喜欢的任何东西。这就是魔法工作的方式。根据你想要做的工作类型,有不同程度的输入变换。

需要注意的是,如果没有可变阴影魔法,你定义了一个叫魔dance,然后In[1]: dance会触发你的魔法,而不是语法错误的代码,它可能比一个自定义的语法变压器的方式更容易。在你的情况下,一个神奇的名字knockdance应该足够了。魔术师面前的%仅用于消除某些情况下的歧义,否则不必要。这就是如何在IPython中工作(技术上他们是别名,但技术上的区别在这里不相关)。 Here是如何定义自定义魔术。

如果你确实需要覆盖,你需要子类TerminalInteractiveShell,你可以告诉IPython通过this option将它与你的自定义类交换。一旦你得到它与终端一起工作,它应该很容易成为一个内核,但这也需要与IPykernel一起玩,这使得事情变得复杂化,作为第一步。