如何告诉 Python 脚本停止调试器附加到进程?

Nit*_*kin 5 python debugging

有没有办法告诉 Python 在脚本中的某个点停止执行并等待调试器附加到进程?

有没有类似于Debugger.Break()Python 中的dot-Net 的东西?

Chr*_*unt 5

不同的 IDE 可以使用不同的方法来附加到进程,但是 PyCharm、Eclipse、Visual Studio 和 VS Code 都使用pydevd(VS/VSC 通过其 Python 插件通过ptvsd)来提供它们的进程内调试器实现。因此,我们可以用一段代码来定位那些。

这个想法是等到pydevd被导入,然后在断点处停止。

import sys
import threading

from importlib.abc import MetaPathFinder


class NotificationFinder(MetaPathFinder):
    def find_spec(self, fullname, _path, _target=None):
        if 'pydevd' in fullname:
            with t:
                t.notify()

t = threading.Condition()
sys.meta_path.insert(0, NotificationFinder())

with t:
    t.wait()

breakpoint()
Run Code Online (Sandbox Code Playgroud)

由于 pydevd 创建__builtins__.breakpoint,无论 Python 版本如何,这都应该有效。我在 PyCharm(社区版 2019.1.3)中进行了测试。我启动了脚本,在我的 IDE 中附加了“附加到进程”选项,并且能够成功附加。然后脚本breakpoint()按预期停止。