【问题标题】:In the Python debugger pdb, how do you exit interactive mode without terminating the debugging session在 Python 调试器 pdb 中,如何在不终止调试会话的情况下退出交互模式
【发布时间】:2016-08-25 00:16:49
【问题描述】:

使用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 模式?这甚至可能吗?

理想情况下,我想在我停止的地方返回到调试模式,这样我就可以继续单步执行我的代码。

【问题讨论】:

    标签: python debugging pdb


    【解决方案1】:

    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
    ...
    

    【讨论】:

    • 额外提示:CTRL-D 在结束一整天的工作后关闭数十个打开的终端/SSH 会话也非常方便:它(通常)会立即关闭终端模拟器中的该选项卡, except 如果命令行中还有半键入的命令或前台正在运行的程序。
    • 我认为 CTRL-D 刚刚杀死了我的整个 Spyder 实例。
    • 在 jupyter notebook(在 Firefox 中)它不起作用。 Ctrl+D 用于创建书签。也在这里讨论stackoverflow.com/questions/47522316/…
    【解决方案2】:

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

    ipython/python 3.5ipdbpdb 中测试

    【讨论】:

      【解决方案3】:

      对于那些在 jupyter notebook 中寻找解决方案的人(但又不想​​学习 emacs)。我找到了一个对我有用的(来自here)。

      在 linux shell 中:

      echo ^D | xclip -selection clipboard 
      

      但是,您不要将 ^D 键入为字符,而是键入 ctrl-v ctrl-d...

      【讨论】:

        【解决方案4】:

        https://github.com/jupyter/notebook/issues/3603#issuecomment-747392494

        from pandas.io.clipboard import copy; copy("\x04")

        将 Ctrl-D 复制到剪贴板,然后粘贴并输入。

        【讨论】:

          【解决方案5】:

          在 Python 3 中,使用交互式解释器:

          (Pdb) code.interact()
          >>> (Enter your commands)
          >>> ...
          >>> exit() # Exit interactive mode
          (Pdb) c
          

          您也可以在主代码中导入“代码”,然后在“Pdb”模式下使用code.interact()

          回复:https://docs.python.org/3/library/code.html

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              如果您使用 Emacs 并通过 M-x shell 访问 pdb 交互模式,我能找到的最好方法是调用 comint-quit-subjob (C-c C-\)。这会终止整个调试会话并将您返回到 shell 会话,而不是像 comint-send-eof (C-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>
              
              

              【讨论】:

                【解决方案8】:

                在 Windows 10 上,按 Ctrl + Z 并回车。

                【讨论】:

                  【解决方案9】:

                  在相关说明中,如果您想完全退出调试器,只需按 q 然后回车即可。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-04-17
                    • 2019-12-23
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多