有没有办法告诉 Python 在脚本中的某个点停止执行并等待调试器附加到进程?
有没有类似于Debugger.Break()Python 中的dot-Net 的东西?
不同的 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()按预期停止。