web-dev-qa-db-fra.com

Comment démarrer le débogage à distance avec PyCharm?

J'essaie d'obtenir le débogage entre PyCharm (sur Windows Host) et un hôte virtuel Debian exécutant mon Django. Les instructions disent d'installer Egg, d'ajouter l'importation, puis d'appeler un Je suppose que ces choses doivent être faites sur l’hôte Debian?

Ok, alors, dans quel fichier dois-je mettre ces deux lignes?

from pydev import pydevd
pydevd.settrace('not.local', port=21000, stdoutToServer=True, stderrToServer=True)

J'ai essayé de le mettre dans le settings.py mais j'ai obtenu ce genre de chose ...

File "/Django/conf/__init__.py", line 87, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
File "/Django/utils/importlib.py", line 35, in import_module
    __import__(name)
File "/settings.py", line 10, in <module>
    pydevd.settrace('dan.local', port=21000, stdoutToServer=True, stderrToServer=True)
File "/pycharm-debug.Egg/pydev/pydevd.py", line 1079, in settrace
    debugger.connect(Host, port)
File "/pycharm-debug.Egg/pydev/pydevd.py", line 241, in connect
    s = StartClient(Host, port)
File "/pycharm-debug.Egg/pydev/pydevd_comm.py", line 362, in StartClient
    sys.exit(1)
SystemExit: 1

Pendant que pycharm restait assis "en attente de connexion"

47
John Mee

PyCharm (ou votre idée de choix) agit comme le "serveur" et votre application est le "client"; donc vous démarrez d'abord le serveur - dites à IDE de 'déboguer' - puis exécutez le client - qui est du code avec l'instruction settrace dedans. Lorsque votre python frappe le settrace qu'il se connecte au serveur - pycharm - et commence à lui fournir les données de débogage.

Pour y arriver:

1. Copiez la bibliothèque pydev sur la machine distante

J'ai donc dû copier le fichier depuis C:\Program Files\JetBrains\PyCharm 1.5.3\pycharm-debug.Egg sur ma machine Linux. Je l'ai mis à /home/john/api-dependancies/pycharm-debug.Egg

2. Mettez l'œuf dans le PYTHONPATH

J'espère que vous apprécierez de ne pas pouvoir utiliser l'oeuf à moins que python puisse le trouver. Je suppose que la plupart des gens utilisent easy_install mais dans mon cas, je l'ai ajouté explicitement en mettant ceci:

   import sys
   sys.path.append('/home/john/app-dependancies/pycharm-debug.Egg')

Cela n'est nécessaire que parce que je n'ai toujours pas réussi à installer un œuf. Ceci est ma solution de contournement.

. configurez la configuration du serveur de débogage

Dans PyCharm, vous pouvez configurer le serveur de débogage via:

  • Exécuter -> Modifier les configurations : ouvre les 'Configurations Exécuter/Déboguer' dialogue
  • Valeurs par défaut -> "Python Remote Debug": est le modèle à utiliser
  • remplissez le nom d'hôte local et le port et vous voudrez probablement utiliser le mappage de chemin, mais plus sur tout cela ci-dessous ...
  • "D'ACCORD"

    nom d'hôte local: signifie le nom du serveur - c'est la machine hôte Windows dans mon cas - ou en fait l'adresse IP de la machine hôte Windows car le nom d'hôte n'est pas connu de ma machine distante. La machine virtuelle (distante) doit donc pouvoir atteindre l'hôte. ping et netstat sont bons pour cela.

    Port: peut être n'importe quel port libre non privilégié que vous aimez. par exemple: 21000 est peu susceptible d'être utilisé.

    Ne vous inquiétez pas des mappages de chemin pour l'instant.

4. Démarrez le serveur de débogage

  • Exécutez -> Débogage : démarrez le serveur de débogage - choisissez la configuration que vous vient d'être créé.

L'onglet de console de débogage apparaîtra et vous devriez obtenir

 Starting debug server at port 21000

dans la console, ce qui signifie que le serveur de débogage ide attend que votre code lui ouvre une connexion.

5. Insérez le code

Cela fonctionne à l'intérieur d'un test unitaire:

from Django.test import TestCase
class APITestCase(TestCase):
    def test_remote_debug(self):
        import sys
        sys.path.append('/home/john/dependancies/pycharm-debug.Egg')
        from pydev import pydevd
        pydevd.settrace('192.168.33.1', port=21000, suspend=False)

        print "foo"

Et dans une application Web Django, il est un peu capricieux de savoir où vous le mettez - ne semble fonctionner qu'après tout le reste:

if __== "__main__":
    os.environ.setdefault("Django_SETTINGS_MODULE", "settings")
    from Django.core.management import execute_from_command_line
    execute_from_command_line(sys.argv)

    sys.path.append('/vagrant/pycharm-debug.Egg')
    import pydevd
    pydevd.settrace('192.168.33.1', port=21000, suspend=False)

Encore une fois, l'adresse IP est la boîte sur laquelle vous exécutez Pycharm; vous devriez pouvoir cingler cette adresse IP à partir de la boîte exécutant votre code/site Web. Le port est votre choix, assurez-vous simplement d'avoir dit à pycharm d'écouter sur le même port. Et j'ai trouvé le suspend=False moins problématique que les valeurs par défaut, non seulement l'arrêt immédiat, vous n'êtes donc pas sûr que cela fonctionne, mais essayez également de diffuser vers stdin/out, ce qui pourrait également vous inquiéter.

6. Ouvrez le pare-fe

Le pare-feu Windows 7 bloquera par défaut votre connexion entrante. En utilisant netstat sur l'hôte distant, vous pourrez voir que SYN_SENT ne devient jamais ESTABLISHED, du moins pas jusqu'à ce que vous ajoutiez une exception au pare-feu Windows pour l'application "pycharm".

OS/X et Ubuntu n'ont pas de pare-feu à lancer (par défaut, quelqu'un peut en avoir appliqué un plus tard).

7. Définissez un point d'arrêt et exécutez le code

Après tout cela, lorsque tout se passe comme prévu, vous pouvez définir un point d'arrêt - quelque part après l'exécution de settrace - et la console pycharm affichera

Connected to pydev debugger (build 107.386)

et sous l'onglet "Débogueur", la pile de variables commencera à fonctionner et vous pourrez parcourir le code.

8. Mappages

Le mappage indique à pycharm où il peut trouver le code source. Ainsi, lorsque le débogueur dit "j'utilise la ligne 393 du fichier /foo/bar/nang.py, Pycharm peut traduire ce chemin absolu distant en un chemin local absolu ... et vous montrer le code source.

/Users/john/code/app/    /opt/bestprice/app/
/Users/john/code/master/lib    /opt/bestprice/lib/python2.7/site-packages

Terminé.

108
John Mee

Ce n'est qu'une note, en fait, mais contient des informations qui peuvent faire gagner des heures.

  1. Maintenant pip install pydevd a travaillé pour moi sur ubuntu et centos 6
  2. Si vous voulez vraiment déboguer le serveur distant qui est derrière les pare-feu et tout ça, vous pouvez utiliser l'astuce suivante:

ssh -R 8081: localhost: 8081 [email protected]

cela permet au code à distance de se connecter à votre machine en écoutant sur localhost: 8081

  1. Si le débogueur distant ne veut pas démarrer, en disant qu'il ne trouve pas de port socket, vérifiez vos règles de pare-feu. Notez que la règle avec "127.0.0.1" n'est pas identique à "localhost".
9
Sergey

Il semble que pour une raison quelconque, le débogueur n'a pas pu se connecter à votre hôte Windows avec PyCharm. Vous n'avez pas d'autres messages dans stderr? Si ce n'est pas le cas, essayez de l'exécuter une fois de plus, mais avec sterrToServer = false. Cela peut montrer la vraie raison pour laquelle il ne se connecte pas.

1
Dmitry Trofimov