Мне нужно запустить код в "отделенном" (не интерактивном).И когда обнаруживается какая-либо ошибка, я хотел бы запустить отладчик.Вот почему я думал об удаленном отладчике / ноутбуке Jupyter или о чем угодно.Итак, по умолчанию сеанс отладки отсутствует, так что я думаю, что удаленный отладчик PyCharm - это не тот случай.
Вопреки тому, что может показаться здесь, вам не нужно запускать кодв «сеансе отладки» для использования удаленной отладки.
Попробуйте выполнить следующее:
Установите pydevd
в среде Python для своего «отдельного» кода:
pip install pydevd
В тех местах в этом коде, где вы в противном случае использовали бы pdb.set_trace
, пишите
import pydevd; pydevd.settrace('your-debugger-hostname-or-ip')
Теперь всякий раз, когда ваш коднажимает на инструкцию pydevd.settrace
, она пытается подключиться к вашему серверу отладчика.
Затем вы можете запустить сервер отладчика из Eclipse PyDev или Pycharm и подключить к нему «отслеживаемый» процесс, готовый к отладке.,Подробнее см. здесь .
Разумеется, вам решать, что делать в случае тайм-аута соединения - вы можете либо заставить свой процесс ждать отладчик вечнов петле, или сдаться в какой-то момент.Вот пример, который, кажется, работает для меня (запустил службу на удаленной машине с Linux, подключил к ней через SSH с удаленной переадресацией портов, запустил локальный сервер отладки через Eclipse PyDev под Windows)
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()
Похоже, вам следует запустить локальный сервер отладки перед включением переадресации портов.В противном случае settrace
зависает бесконечно, очевидно, полагая, что он «подключен», а на самом деле это не так.
Похоже, существует небольшой проект с именем rpcpdb с аналогичной целью, однако яне смог заставить его работать прямо из коробки, поэтому не могу много комментировать (я уверен, что пошаговое выполнение кода в IDE в любом случае намного удобнее).