Ipython: 在终端 ipython 和 ipython 控制台中启动多行输入

创建于 2012-10-15  ·  14评论  ·  资料来源: ipython/ipython

qtconsole (通过ctrl-enter )和笔记本中(通过单元格内的enter ),您可以将任何一行输入转换为多行输入。 为终端和控制台入口点提供类似的东西会很好。

目前,一种潜在的解决方法是使用if 1:作为输入的第一行,然后在所有客户端中启动多行输入,但这似乎有点尴尬。

一般来说,在可能的情况下,我认为在不同的客户端之间实现功能对等是有意义的。

具体示例:我可以通过在每行末尾按ctrl-enter使用 qtconsole 输入以下输入:

In [2]: print "hello"
   ...: print "this is all one input"
   ...: print "same here..."
   ...: 

如果我执行该行,然后启动基于终端的 ipython 客户端并按向上箭头,我将看到适当的提示:

In [1]: print "hello"
print "this is all one input"
print "same here..."

可以执行和运行,但是没有办法像从终端那样输入自由格式的多行输入,这使得工作流程很尴尬。

感谢@michaelpacer引起我的注意。

最有用的评论

ctrl+o对我有用(在 cmd 和 conemu 控制台中尝试过)。

也可以使用(

 In [84]: (
     ...: fig, ax = plt.subplots(1,2)
     ...: ax[0].plot([1,2,3])
     ...: ax[1].plot([3,2,1])
     ...: fig.show()
     ...:

完成输入后,只需返回第一行并删除(

所有14条评论

我认为我们在这里遇到了终端/读取线的限制。 据我所知,没有简单的方法来检测 ctrl-enter。 我们只需调用raw_input()并返回一个字符串 - 如果用户按下 Ctrl-D 或 Ctrl-C,则会引发异常。

作为一个长期项目,可以通过使用pyrepl之类的库而不是 readline 来做到这一点。 这是我们一直感兴趣的事情,但没有人有时间仔细研究它。 另一种方法是使用 curses 或类似的工具(如 urwid)构建一个新的前端。

您可以做的一件事是按 ctrl-v、ctrl-j 输入换行符而不运行输入。 我认为这是 Bash 本身的一部分,因为它也适用于终端(ctrl-v 表示将下一个热键视为控制序列,而 ctrl-j 是换行符)。 我没有机会在这方面与 iTerm2 混淆,但也许可以以某种方式将 ctrl-enter 映射到该双序列?

编辑:您确实可以至少在 iTerm2 中复制它。 可以转到您的全局快捷键并将 ctrl-enter 设置为“发送十六进制代码”然后:0x16 0x0a

现在是否有可能使用prompt_toolkit获得这种类型的功能?

是的,虽然没有使用 enter 快捷方式 - 似乎我们可以用 enter 检测到的唯一 enter 组合是Alt-Enter (或Esc, Enter ),我们已经在使用它来强制执行(即不要添加换行符)。 不过,我们可以使用另一个快捷方式来执行此操作 - 或者您可以添加自定义快捷方式

在当前的 IPython 中,您可以执行此操作的一种方法是按 F2,这会将您放入编辑器,并在完成后将内容放入您的输入中。 您可以通过设置$EDITOR环境变量来控制它打开的编辑器。

Windows 上的 Alt-Enter 将 ipython 窗口更改为全屏。

使用最新的 ipython 和 prompt_toolkit,如果你启用vi-mode ,你可以输入你的命令,然后按ESC ,然后按o 。 这将创建一个新行,就像在 vi 中一样。

通过这种方式,您可以拥有多行命令。

In [29] : %reset -s #----> press `ESC` then `o`
            %run foo.py

参考

  1. 在 ipython 中启用 Vi 模式:http: //koo.fi/blog/2016/08/04/enable-vi-editing-mode-in-ipython-5/

刚碰到这个。 我很肯定 ctrl-enter 用于创建新行!?! 但是这个问题表明我错了:(

另一种选择是将分号解释为行分隔符。 例如

%run slow_script.py; !display_notification.sh

将运行我的 python 脚本,然后执行一些 bash 脚本。

编辑:这实际上不起作用,这只是一个建议

我用 ;

cv2.imshow('图像', im) ;
cv2.waitKey(0) ;
cv2.destroyAllWindows()

ctrl+o对我有用(在 cmd 和 conemu 控制台中尝试过)。

也可以使用(

 In [84]: (
     ...: fig, ax = plt.subplots(1,2)
     ...: ax[0].plot([1,2,3])
     ...: ax[1].plot([3,2,1])
     ...: fig.show()
     ...:

完成输入后,只需返回第一行并删除(

我用 ;

cv2.imshow('图像', im) ;
cv2.waitKey(0) ;
cv2.destroyAllWindows()

您似乎不能以这种方式混合 python 和魔法:

In [5]: %run test.py ;\
   ...: !echo foo

hi

按 ctrl+o 对我有用(在 cmd 和 conemu 控制台中尝试过)。

对我来说是alt+o

对我来说是 ctrl+o

Ctrl+o 对我有用ipython ,但不是jupyter console

Ctrl+O 有效,这个问题可以关闭

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

frenzymadness picture frenzymadness  ·  3评论

henryiii picture henryiii  ·  3评论

ipython picture ipython  ·  3评论

alvations picture alvations  ·  4评论

quchunguang picture quchunguang  ·  3评论