use*_*414 5 python debugging jupyter-notebook
我想设置一些调试命令(如import ipdb; ipdb.set_trace()),它将在jupyter中运行调试器(我必须运行HTTP服务器).有人知道这样的事吗?
上下文:我有一个由调度程序处理的长时间运行的任务(不是交互模式).我希望能够以同样的方式运行它来调试这样的任务.
我需要以“独立”(非交互)方式运行代码。当检测到某些错误时,我想运行调试器。这就是为什么我一直在考虑远程调试器/jupyter 笔记本或其他东西。所以 - 默认情况下没有调试会话 - 所以我认为 PyCharm 远程调试器不是这种情况。
与您在这里的想法相反,您实际上并不需要在“调试会话”中运行代码来使用远程调试。
请尝试以下操作:
在 Python 环境中安装pydevd“独立”代码:
pip install pydevd
Run Code Online (Sandbox Code Playgroud)在该代码中您本来会使用 的地方pdb.set_trace,编写
import pydevd; pydevd.settrace('your-debugger-hostname-or-ip')
Run Code Online (Sandbox Code Playgroud)现在,每当您的代码命中指令时pydevd.settrace,它都会尝试连接到您的调试器服务器。
然后,您可以从 Eclipse PyDev 或 Pycharm 中启动调试器服务器,并将“跟踪”进程连接到您以准备调试。阅读此处了解更多详细信息。
当然,由您决定在连接超时的情况下该怎么做 - 您可以让进程在循环中永远等待调试器,或者在某个时刻放弃。这是一个似乎对我有用的示例(在远程 Linux 计算机上运行该服务,通过带有远程端口转发的 SSH 连接到它,在 Windows 下通过 Eclipse PyDev 启动本地调试服务器)
import pydevd
import socket
from socket import error
def wait_for_debugger(ex, retries=10):
print("Bam. Connecting to debugger now...")
while True:
try:
pydevd.settrace()
break
except SystemExit:
# pydevd raises a SystemExit on connection failure somewhy
retries -= 1
if not retries: raise ex
print(".. waiting ..")
def main():
print("Hello")
world = 1
try:
raise Exception
except Exception as ex:
wait_for_debugger(ex)
main()
Run Code Online (Sandbox Code Playgroud)
不过,您似乎应该在启用端口转发之前启动本地调试服务器。否则settrace会无限挂起,显然相信它已“连接”,但实际上并未连接。
似乎还有一个名为rpcpdb的小项目具有类似的目的,但是我无法让它开箱即用,因此无法发表太多评论(我确信在 IDE 中单步执行代码会更方便)反正)。