Как использовать 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

Другие вопросы по тегам