【问题标题】:How to halt a Python script - only if it is being debugged如何停止 Python 脚本 - 仅当它正在被调试时
【发布时间】:2019-01-07 19:54:41
【问题描述】:

A similar question

在Delphi中开发一些Windows桌面的东西时,我有插入
asm(int 3);的习惯。

如果调试器正在运行,它就像一个断点。如果没有调试器在运行,它什么也不做 (NOOP)。

我想为我的 Python 脚本做一些类似的事情。有没有像 HaltDebugger() 这样的 Python 函数?当然是跨平台。


[更新] 我正在寻找可以与 PyCharm 一起使用的东西

【问题讨论】:

    标签: python debugging breakpoints


    【解决方案1】:

    这是最便携的解决方案。下面为 PyCharm 绘制了一个更困难的草图。

    取决于调试器,但如果你使用pdb(这将是跨平台的),the docs state

    从正在运行的程序闯入调试器的典型用法是 插入

    import pdb; pdb.set_trace()
    

    您希望这是有条件的,因此您可以在每个断点处粘贴:

    try: pdb.set_trace()
    except NameError: pass
    

    当你想在顶部调试 import pdb 时。如果它必须是一行,则不能使用鸭式打字。而是:

    if 'pdb' in globals(): pdb.set_trace()
    

    仅限 PyCharm

    假设您坚持不使用鼠标标记调试行,这可能有效:

    使用exception breakpoints

    PyCharm 为 Python、Django 和 JavaScript。

    当指定异常发生时触发异常断点 抛出。与需要特定源的行断点不同 引用,异常断点全局应用于异常 条件,而不是特定的代码引用。

    根据处理异常的类型,调试可以 当进程因异常终止时中断,或者一旦 发生异常。

    你可以:

    1. 在您的项目中创建自定义异常,DebugException
    2. 按照上面的链接设置异常断点。确保将其设置为立即触发,而不是在程序退出时触发。
    3. 最后,

    粘贴

        try: raise DebugException()
        Exception: pass
    

    任何你想打破的地方。不双击鼠标来标记断点似乎很麻烦。

    【讨论】:

    • 我的错。我忘了说我正在使用 PyCharm(但赞成一个好的答案)。我希望这表现得像我遇到了断点。当我在 PyCharm 调试器中使用它时,我得到 PYDEV DEBUGGER WARNING: sys.settrace() should not be used when the debugger is being used. This may cause the debugger to stop working correctly. 并且没有伪断点:-(
    • 也许我不明白关于 PyCharm 的问题...?在 PyCharm 中,只需在行号和行内容之间单击即可设置断点。然而,“import pdb; pdb.set_trace()”样式也应该是完全有效的。在 Py3.7+ 中,您可以改用 breakpoint()。
    • @Mawg 我赞同 mirek 所说的,我添加了一种可能可行的方法,欢迎您尝试并告诉我们它是如何进行的,但我不确定它是否比仅使用鼠标。
    • 这个想法是我有很多异常处理,每个函数一次,几十个函数。每当我捕获异常时,我希望调试器停止,就好像它遇到了断点一样。我还希望能够删除所有断点,而不必手动重置所有异常处理程序中的断点
    • @Mawg 好吧,异常在我链接的文档中,您可以使用它来相对简单地捕获每个异常抛出。可以从断点对话框中删除所有断点。也许玩弄应用程序中的对话,看看是否合适。
    猜你喜欢
    • 2015-06-03
    • 2018-08-02
    • 1970-01-01
    • 2015-09-01
    • 2017-04-09
    • 2019-08-23
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多