键绑定到交互式执行来自Python解释器历史的命令?

时间:2012-09-21 16:34:41

标签: keyboard-shortcuts python readline

我有时会测试Python模块,因为我通过在终端中运行Python交互式提示,导入我的新模块并测试功能来开发它们。当然,由于我的代码正在开发中,因此存在错误,并且需要频繁重启解释器。当我在重新启动之前只执行了几个解释器行时,这并不是太痛苦:当解释器重启时看起来像Up Up Enter Up Up Enter时我的键序列...但是将它推断为5个或更多要重复的语句并且它变得非常痛苦!

当然我可以把我的测试代码放到一个用python -i执行的脚本中,但是这是一个划痕活动,它看起来并没有“高于阈值”打开文本编辑器:)我真的很害怕来自bash shell的Ctrl-r行为:在bash中按顺序执行10个命令序列涉及在历史记录中查找命令(重复UpCtrl-r表示搜索 - 两者都在Python解释器shell中工作,然后只按Ctrl-o十次。我最喜欢的bash shell功能之一。

问题在于,虽然许多其他readline绑定功能(如Ctrl-aCtrl-eCtrl-rCtrl-s在Python解释器中起作用,Ctrl-o才不是。虽然或许 readline模块可用于将此功能添加到python提示符,但我无法在线找到任何引用。有什么建议吗?

编辑:是的,我知道使用交互式解释器并不是一种可以扩展到几行的开发方法!但它对于小型测试很方便,而且IMO的交互性可以帮助确定开发的API是自然,方便还是过重。因此,请将技术问题的答案局限于是否可以使用readline历史记录步骤在python中工作,而不是侧重于是否应该选择(有时)以这种方式工作!

编辑:自发布以来,我意识到我已经在使用readline模块来使一些Python解释器历史记录功能起作用。但是,即使我将operate-and-get-next放在readline.parse_and_bind("Control-o: operate-and-get-next")文件中,似乎也不支持Ctrl-o与PYTHONSTARTUP readline命令的绑定。

4 个答案:

答案 0 :(得分:4)

  

我经常测试Python模块,因为我通过在终端中运行Python交互式提示,导入我的新模块并测试功能来开发它们。

停止使用此模式并开始在文件中编写测试代码,您的生活将变得更加轻松。

  • 无论如何,运行该文件的麻烦都会少一些。

  • 如果您自动进行检查而不是阅读结果,那么检查代码会更快,更不容易出错。

  • 您可以在完成后保存该文件,并在更改代码或环境时运行该文件。

  • 您可以对测试执行指标,例如确保您没有未测试的部分代码。

您熟悉unittest module吗?

答案 1 :(得分:1)

在对python-ideas列表进行一些讨论之后回答我自己的问题:尽管在一些readline文档中有相互矛盾的信息,但operate-and-get-next函数实际上被定义为readline的bash扩展,而不是核心readline 。

因此,当在Python解释器会话中导入Ctrl-o模块时,以及在尝试手动强制执行此绑定时,readline在默认情况下既不像预期的那样行为:readline中不存在该函数图书馆要受约束。

Google搜索显示https://bugs.launchpad.net/ipython/+bug/382638,GNU readline维护者在其上提供将此功能添加到核心readline的原因,并说它应该由调用应用程序实现。他还说“它的实现并不复杂”,尽管对于我来说,如何(或者甚至是否可能)将其作为readline模块行为的纯Python扩展并不明显。

所以不,这是不可能的,除非来自bash的operate-and-get-next函数在Python readline模块或解释器本身中显式实现。

答案 2 :(得分:0)

这不是您问题的答案,但如果这是您的开发风格,您可能需要查看DreamPie。它是Python终端的GUI包装器,提供各种方便的快捷方式。其中之一是能够在解释器显示中进行拖动选择并仅复制代码(而不是输出)。然后,您可以粘贴此代码并再次运行它。对于您描述的工作流程类型,我觉得这很方便。

答案 3 :(得分:0)

您最好的选择是检查该项目:http://ipython.org

这是一个使用 Ctrl + R 进行历史搜索的示例:

enter image description here

修改 如果您正在运行debian或派生:

sudo apt-get install ipython