web-dev-qa-db-fra.com

Comment attacher un débogueur distant à un processus Python?

Je suis fatigué d'insérer

import pdb; pdb.set_trace()

lignes dans mes programmes Python et débogage via la console. Comment connecter un débogueur distant et insérer des points d'arrêt à partir d'une interface utilisateur civilisée?

53
joeforker

utilisez Winpdb . Il s'agit d'un indépendant de la plate-forme GPL graphique Python débogueur avec prise en charge du débogage à distance sur un réseau, plusieurs threads, modification de l'espace de noms , débogage intégré, communication cryptée et jusqu'à 20 fois plus rapide que pdb.

Fonctionnalités:

  • Licence GPL. Winpdb est un logiciel libre.
  • Compatible avec CPython 2.3 à 2.6 et Python 3000
  • Compatible avec wxPython 2.6 à 2.8
  • Indépendant de la plateforme et testé sur Ubuntu Gutsy et Windows XP.
  • Interfaces utilisateur: rpdb2 est basé sur la console, tandis que winpdb nécessite wxPython 2.6 ou version ultérieure.

Screenshot
(source: winpdb.org )

57
nosklo

Eh bien, vous pouvez obtenir quelque chose de très similaire à cela en utilisant un regard tordu, qui fonctionne comme ceci:

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() 

Ensuite, vous vous connectez simplement au programme via ssh;

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

Utilisation de foobar comme mot de passe.

Lorsque vous vous connectez, vous obtiendrez une invite normale python où vous pouvez simplement piquer les données. Ce n'est pas tout à fait la même chose que d'obtenir un retraçage envoyé à un hôte.

Maintenant, cela peut être difficile à intégrer à un programme GUI, dans ce cas, vous devrez peut-être choisir un autre réacteur, par exemple pour les programmes basés sur gtk utilisés le gtk2reactor etc.

Si vous voulez que la traceback réelle soit envoyée, vous devez créer un canal de socket pour stderr, stdin et stdout qui passe sur le réseau au lieu d'imprimer sur votre hôte local. Ne devrait pas être trop difficile à réaliser en utilisant torsadé.

17
Johan Dahlin

Un peu en retard, mais voici une solution de débogage à distance très légère gracieuseté de http://michaeldehaan.net/post/35403909347/tips-on-using-debuggers-with-ansible :

  1. pip install epdb Sur l'hôte distant.
  2. Assurez-vous que votre configuration de pare-feu n'autorise pas les connexions non locales au port 8080 sur l'hôte distant, car epdb utilise par défaut l'écoute sur n'importe quelle adresse (INADDR_ANY), Pas 127.0.0.1.
  3. Au lieu d'utiliser import pdb; pdb.set_trace() dans votre programme, utilisez import epdb; epdb.serve().
  4. Connectez-vous en toute sécurité à l'hôte distant, car epdb.connect() utilise telnet.
  5. Attachez-vous au programme à l'aide de python -c 'import epdb; epdb.connect()'.

Ajustez les bits de sécurité en fonction de la configuration de votre réseau local et de votre position de sécurité, bien sûr.

12
CitizenB

Deux solutions d'IDE modernes:

  1. Débogage à distance multiplateforme PTVS

  2. Débogage à distance PyCharm/PyDev

2
denfromufa