Как мне подключить удаленный отладчик к процессу Python?
Я устала вставлять
import pdb; pdb.set_trace()
строки в мои программы на Python и отладка через консоль. Как подключить удаленный отладчик и вставить точки останова из цивилизованного пользовательского интерфейса?
4 ответа
Используйте Winpdb. Это независимый от платформы графический GPL-отладчик Python с поддержкой удаленной отладки по сети, несколькими потоками, модификацией пространства имен, встроенной отладкой, зашифрованной связью и работает в 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 или новее.
(источник: winpdb.org)
Немного поздно, но вот очень легкое решение для удаленной отладки, предоставленное http://michaeldehaan.net/post/35403909347/tips-on-using-debuggers-with-ansible:
pip install epdb
на удаленном хосте.- Убедитесь, что настройки брандмауэра не разрешают нелокальные подключения к порту 8080 на удаленном хосте, поскольку
epdb
по умолчанию прослушивание на любом адресе (INADDR_ANY
), а не 127.0.0.1. - Вместо того, чтобы использовать
import pdb; pdb.set_trace()
в вашей программе используйтеimport epdb; epdb.serve()
, - Безопасный вход на удаленный хост, так как
epdb.connect()
использует телнет. - Присоединить к программе используя
python -c 'import epdb; epdb.connect()'
,
Разумеется, установите биты безопасности в соответствии с настройками и позицией безопасности вашей локальной сети.
Ну, вы можете получить что-то очень похожее на это, используя витой люк, который работает так:
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, который будет передаваться по сети вместо печати на локальный хост. Не должно быть слишком сложно достичь с помощью витой.
Два решения от современных IDE:
PTVS межплатформенная удаленная отладка
PyCharm/PyDev удаленная отладка
Я нахожу pudb полезным в экстренных случаях
pip install pudb
Описание проекта https://pypi.org/project/pudb/
Учебник: https://vimeo.com/5255125