python - 如何编写 IPython shell 的包装器?

标签 python linux shell ipython

我想创建一个环绕 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):") 之类的操作并等待缩进的 next线。它只是抛出。
  3. 使用Popen 打开一个IPython session 并与它进行乒乓球。我遵循了一些关于使用管道的教程,但我要么管道坏了要么有线。在我深入研究之前,绝对需要复习我的操作系统类(class)。

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

任何评论都会有所帮助。提前致谢:)

最佳答案

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

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

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

关于python - 如何编写 IPython shell 的包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46031501/

相关文章:

linux - 在内部使用 sudo 命令运行脚本时出现问题

linux - Bash 脚本 - 连接到远程服务器并获取结果

python - 元素不可点击(按钮被其他元素阻挡)

python - 从 Python 集合中请求一个元素

python - 用扭曲的延迟测试

linux - 在linux中用mingw编译opengl

PYTHONPATH 被忽略

c - 来自多个线程的相同 fd 上的 `select`

linux - 为什么 ksh 在嵌套命令替换期间无法捕获标准错误?

regex - 根据文件和文件夹名称的正则表达式匹配将文件复制到文件夹中