在Python调试器pdb中,如何退出交互模式而不终止调试会话

42

使用 Python 3.5.1 版本。

当我使用 Python 调试器模块运行脚本时:

  [home]# python -m pdb myscript.py

这将启动调试会话:

  > /somepath/to/myscript.py(1)<module>()
  -> import os
  (Pdb) 

如果我想要在调试会话中进入交互式终端,我可以使用interact命令:

(Pdb) interact
*interactive*
>>>

现在我可以像在运行的 Python 交互模式中一样与代码进行交互,访问进入 interact 模式时正在调试器中运行的脚本范围内的任何函数或变量。

当我发出命令退出交互模式(以继续调试)时,它会终止整个调试会话:

>>> exit()
The program exited via sys.exit(). Exit status: None
....long nasty stack trace here....

[home]#

我也尝试了quit(),它也终止了调试器。

你如何在不终止整个调试会话的情况下退出interact模式?这真的可能吗?

理想情况下,我希望回到离开时的调试模式,以便可以继续逐步执行我的代码。

9个回答

48

按下Ctrl + D发送一个EOF应该起作用:

$ python -m pdb myscript.py
> .../myscript.py(1)<module>()
-> import os
(Pdb) import code
(Pdb) code.interact()
Python 2.7.11 (default, Dec 27 2015, 01:48:39)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> <CTRL-D>
(Pdb) c
...

4
额外提示:CTRL-D也非常方便,可以在工作了一整天并打开了许多终端/ SSH会话后快速关闭这些会话:它通常会立即关闭你的终端仿真器中的标签页,但是如果命令行上仍有半输入的命令或前台正在运行的程序,则不会关闭。 - Lukas Graf
我认为CTRL-D刚刚杀掉了我整个Spyder实例。 - Josiah Yoder
1
在Jupyter Notebook(在Firefox中)它不起作用。Ctrl + D是用于创建书签的。此外,在此处讨论https://dev59.com/xFYN5IYBdhLWcg3wXnT7?noredirect=1&lq=1 - nocibambi

10

如果你正在使用 ipdb,并且在 Windows/Windows10 上,你应该使用 Cntrl-Z>Return 退出交互式 shell。

ipython/python 3.5ipdbpdb 中测试通过。


5

4

对于那些在jupyter notebook中寻找解决方案(但目前不想学习emacs)的人。我发现了一个对我有用的解决方法(来自这里)。

在Linux shell中:

echo ^D | xclip -selection clipboard 

但是,你不会把^D作为字符输入,而是使用ctrl-v ctrl-d组合键来输入。

1
如果您正在使用Emacs并通过M-x shell访问pdb交互模式,最好的方法是调用comint-quit-subjobC-c C-\)来结束整个调试会话,并将您返回到shell会话,而不是像comint-send-eofC-c C-d)一样终止整个shell进程。
(venv) c:\projects\my-project> python my-entry-point.py

    550         import ipdb; ipdb.set_trace(context=10)
--> 551         print("First line to start debugging at")

ipdb> interact
*interactive*
In : # call M-x comint-quit-subjob (C-c C-\)
^C
(venv) c:\projects\my-project>


0
在我的Spyder版本(在Gnome上)中,我无法输入Ctrl+D或Ctrl+Shift+U。因此,要退出交互模式,我会打开一个文本编辑器,输入Ctrl+Shift+U,然后,在不松开Ctrl+Shift的情况下,按下Ctrl+Shift+4。这会在文本编辑器中放置一个字符,我可以将其突出显示并复制。然后,我将其粘贴到Spyder的交互模式中,就可以退出交互模式并回到调试器了。

0
在Windows 10上,按下Ctrl + Z并按Enter键。

0
在 Python 3 中,请使用交互式解释器:
(Pdb) code.interact()
>>> (Enter your commands)
>>> ...
>>> exit() # Exit interactive mode
(Pdb) c

你也可以在主代码中导入 "code",并在 "Pdb" 模式下使用 code.interact()

参考链接:https://docs.python.org/3/library/code.html

(注意:在 Python 2 的交互模式下,exit() 不起作用)


Mac,Python3,exit()将退出整个调试会话,此后不可能进行c - M3RS
我已经不知道code.interact()是什么以及它在哪里被使用了。如果我在我的PY3中在PDB中使用它,我会得到一个很好的“name 'code' is not defined”!如果我使用exit(),脚本就会被终止。 - Apostolos

-2

另外,如果你想完全退出调试器,只需按下q键然后按回车即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接