Как использовать ipdb.set_trace в разветвленном процессе
Я использую ipdb.set_trace()
всякий раз, когда мне нужно установить точку останова в моем коде. Сейчас я пытаюсь использовать его в процессе, который я создал с помощью multiprocessing
пока код останавливается, я не могу ничего набрать, чтобы продолжить отладку. Есть ли способ получить мой stdin
направлено правильно?
В идеале я хотел бы представить новую консоль, открывающуюся каждый раз, когда разветвленный процесс останавливается для отладки, однако я не думаю, что это возможно.
3 ответа
Как подключить отладчик к подпроцессу Python?, http://winpdb.org/ поддерживает multiprocessing
отладки.
Если вы предпочитаете выполнять больше работы для большей гибкости, есть несколько интересных идей по адресу https://gist.github.com/csabahenk/6497709 (слишком долго, чтобы включать их здесь).
Иногда для отладки Вы можете изменить свой код, чтобы использовать multiprocessing.dummy. Таким образом, не будет выполнено никакого форка, он будет работать с потоками и будет легче отлаживать.
Позже (после устранения ошибки...) вы можете переключиться обратно на многопроцессорность
multiprocessing.dummy - должен предлагать тот же API, что и многопроцессорный, так что его легко изменить...
Вместо
pdb.set_trace()
используйте следующее:
import sys
import pdb
class ForkedPdb(pdb.Pdb):
"""A Pdb subclass that may be used
from a forked multiprocessing child
"""
def interaction(self, *args, **kwargs):
_stdin = sys.stdin
try:
sys.stdin = open('/dev/stdin')
pdb.Pdb.interaction(self, *args, **kwargs)
finally:
sys.stdin = _stdin
ForkedPdb().set_trace()
Источник: /questions/43183594/kak-podklyuchit-otladchik-k-podprotsessu-python/43183611#43183611