ipdb需要Ctrl+D来处理命令

2 投票
2 回答
541 浏览
提问于 2025-04-17 16:22

我正在用ipdb调试我的Python脚本。奇怪的是,每次我输入命令,比如n, s, c, b等,我都需要按两次Ctrl+D,ipdb才能处理这个命令并继续执行。

有没有人知道这是为什么,以及我该怎么关闭这个功能

2 个回答

1

事情是这样的:Ctrl+D 并不是用来结束程序的,它只是让程序在等待输入的时候中断一下。当你按下 Ctrl+D 时,其实是在打断程序正在进行的 read() 操作,这个操作是在等你输入内容。

Ctrl+D

大多数程序在读取到 0 字节作为输入时会停止。如果你在没有输入任何内容的情况下按下 Ctrl+D,那么就相当于给输入管道发送了0字节,这可能会导致程序认为没有更多的事情要做,从而关闭。这并不是强制结束。

但是,如果你先输入了一些字符,然后再按 Ctrl+D,那么你打断的 read() 操作会返回你刚才输入的文本,程序会决定继续等待下一次输入。

这就是为什么当你再次按 Ctrl+D 而没有输入新文本时,程序会表现出你预期的行为。

你的情况

这可能是发生的事情:

  1. 你输入了一些字符,这些字符被暂时存储起来。

  2. 你按下 Ctrl+D。这些文本到达了 iPdb,但它没有检测到换行符,因此它会继续等待更多输入。

  3. 你再次按下 Ctrl+D。这次 0 字节到达了 iPdb,它认为没有更多输入了,因此处理这些文本,无论是否有换行符。

2

这个效果不仅仅出现在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/

撰写回答