Как мне подключить удаленный отладчик к процессу Python? - PullRequest
53 голосов
/ 12 февраля 2009

Я устал вставлять

import pdb; pdb.set_trace()

строки в моих программах на Python и отладка через консоль. Как подключить удаленный отладчик и вставить точки останова из цивилизованного пользовательского интерфейса?

Ответы [ 4 ]

57 голосов
/ 13 февраля 2009

использовать Winpdb . Это независимый от платформы графический отладчик Python GPL с поддержкой удаленной отладки по сети, несколькими потоками, модификацией пространства имен, встроенной отладкой, зашифрованной связью и в 20 раз быстрее, чем pdb.

Особенности:

  • Лицензия GPL. Winpdb - свободное программное обеспечение.
  • Совместим с CPython 2.3 до 2.6 и Python 3000
  • Совместимо с wxPython 2.6 - 2.8
  • Независимо от платформы и протестировано на Ubuntu Gutsy и Windows XP.
  • Пользовательские интерфейсы: rpdb2 основан на консоли, в то время как winpdb требует wxPython 2.6 или новее.

Screenshot
(источник: winpdb.org )

17 голосов
/ 13 февраля 2009

Ну, вы можете получить что-то очень похожее, используя витой люк, который работает так:

from twisted.internet import reactor
from twisted.cred import portal, checkers 
from twisted.conch import manhole, manhole_ssh 

def getManholeFactory(namespace):
    realm = manhole_ssh.TerminalRealm()
    def getManhole(_): 
        return manhole.Manhole(namespace) 
    realm.chainedProtocolFactory.protocolFactory = getManhole
    p = portal.Portal(realm)
    p.registerChecker(
        checkers.InMemoryUsernamePassword DatabaseDontUse(admin='foobar'))
    f = manhole_ssh.ConchFactory(p)
    return f

reactor.listenTCP(2222, getManholeFactory(globals()))
reactor.run() 

Тогда вы просто входите в программу через ssh;

$ ssh admin@localhost -p 2222
admin@localhost's password: 

Использование foobar в качестве пароля.

Когда вы войдете в систему, вы получите обычное приглашение на Python, где вы можете просто ткнуть в данные. Это не совсем то же самое, что отправка трассировки на хост.

Теперь, это может быть сложно интегрировать в программу с графическим интерфейсом, в этом случае вам может потребоваться выбрать другой реактор, например, для программ на основе gtk, использующих gtk2reactor и т. Д.

Если вы хотите, чтобы фактическая трассировка возвращалась, вам нужно создать сокет-канал для stderr, stdin и stdout, который будет передаваться по сети вместо печати на локальный хост. Не должно быть слишком сложно выполнить с использованием витой.

11 голосов
/ 05 апреля 2015

Немного поздно, но вот очень легкое решение для удаленной отладки, предоставленное http://michaeldehaan.net/post/35403909347/tips-on-using-debuggers-with-ansible:

  1. pip install epdb на удаленном хосте.
  2. Убедитесь, что ваши настройки брандмауэра не разрешают нелокальные подключения к порту 8080 на удаленном хосте, поскольку epdb по умолчанию прослушивает любой адрес (INADDR_ANY), а не 127.0.0.1.
  3. Вместо использования import pdb; pdb.set_trace() в вашей программе используйте import epdb; epdb.serve().
  4. Безопасный вход на удаленный хост, поскольку epdb.connect() использует telnet.
  5. Присоединиться к программе, используя python -c 'import epdb; epdb.connect()'.

Разумеется, настройте биты безопасности в соответствии с настройками и позицией безопасности вашей локальной сети.

2 голосов
/ 02 марта 2015

Два решения от современных IDE:

  1. Межплатформенная дистанционная отладка PTVS

  2. Удаленная отладка PyCharm / PyDev

...