ipdb需要Ctrl+D来处理命令
我正在用ipdb调试我的Python脚本。奇怪的是,每次我输入命令,比如n, s, c, b
等,我都需要按两次Ctrl+D,ipdb才能处理这个命令并继续执行。
有没有人知道这是为什么,以及我该怎么关闭这个功能?
2 个回答
事情是这样的:Ctrl+D
并不是用来结束程序的,它只是让程序在等待输入的时候中断一下。当你按下 Ctrl+D
时,其实是在打断程序正在进行的 read()
操作,这个操作是在等你输入内容。
Ctrl+D
大多数程序在读取到 0
字节作为输入时会停止。如果你在没有输入任何内容的情况下按下 Ctrl+D
,那么就相当于给输入管道发送了0字节,这可能会导致程序认为没有更多的事情要做,从而关闭。这并不是强制结束。
但是,如果你先输入了一些字符,然后再按 Ctrl+D
,那么你打断的 read()
操作会返回你刚才输入的文本,程序会决定继续等待下一次输入。
这就是为什么当你再次按 Ctrl+D
而没有输入新文本时,程序会表现出你预期的行为。
你的情况
这可能是发生的事情:
你输入了一些字符,这些字符被暂时存储起来。
你按下
Ctrl+D
。这些文本到达了iPdb
,但它没有检测到换行符,因此它会继续等待更多输入。你再次按下
Ctrl+D
。这次0
字节到达了iPdb
,它认为没有更多输入了,因此处理这些文本,无论是否有换行符。
这个效果不仅仅出现在ipdb上:
从技术上讲,按下Ctrl-D会结束传输,只有在这导致输入缓冲区为空时,才会引发EOF(文件结束)。这种情况只会在你按下Ctrl-D之前没有输入任何字符时发生。
来做个实验:
1. At the linux terminal type cat
2. press enter once.
3. enter letters: foo
4. press <Ctrl-D> once, you don't get back to the terminal.
5. press <Ctrl-D> again, you are brought back to the terminal.
结果看起来是这样的:
user@defiant ~ $ cat
foofoouser@defiant ~ $
“foo”被打印了两次,因为第一次按下时清空了你的输入。第二次按下时,它被解释为结束程序。
如何停止这种行为:
在按下Ctrl-D时,不要连接到TTY(终端)。这意味着不要使用普通的Linux终端。不确定这是否真的可行。
如何在ipdb中处理命令:
按下回车键应该会处理命令,视频中有演示: http://www.gregaker.net/2012/apr/05/debugging-python-with-pdb-or-ipdb/