【问题标题】:How to write a wrapper of IPython shell?如何编写 IPython shell 的包装器?
【发布时间】:2017-09-04 06:36:46
【问题描述】:

我想创建一个环绕 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"

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

这是我尝试过的事情:

  1. 子类 IPython.kernel 或类似的东西。我需要的似乎更复杂,但我尝试过但没有成功(无法真正理解它在做什么......)
  2. 使用IPython.get_ipython() 获取交互式IPython shell 的实例并与之进行乒乓球比赛。我真的找不到关于这个的有用文档。我发现可能有用的run_cell() 函数不能执行run_cell("for i in range(10):") 之类的操作,而是等待缩进的下一行。它只是抛出。
  3. 使用Popen 打开一个IPython 会话并与之进行乒乓球运动。我遵循了一些关于使用管道的教程,但我要么是管道坏了,要么是有线的。在我深入研究之前,绝对需要复习我的操作系统课程。

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

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

【问题讨论】:

    标签: python linux shell ipython


    【解决方案1】:

    您的预处理是在 Python 中吗?如果是这样,您想看看inputtransformers,它允许您将用户输入转换为您喜欢的任何内容。这就是魔法的运作方式。根据您想要做的工作类型,有不同级别的输入转换。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多