webentwicklung-frage-antwort-db.com.de

Wie starte ich das Remote-Debugging mit PyCharm?

Ich versuche, ein Debugging zwischen PyCharm (auf Windows Host) und einem virtuellen Debian Host durchzuführen, auf dem meine Anwendung Django=) ausgeführt wird Ich nehme an, dass diese Dinge auf dem Debian-Host erledigt werden müssen.

Ok, in welche Datei soll ich diese beiden Zeilen schreiben?

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

Ich habe versucht, es in die settings.py zu setzen, aber ich habe so etwas ...

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

Während pycharm nur da saß "Warten auf Verbindung"

47
John Mee

PyCharm (oder eine Idee Ihrer Wahl) fungiert als "Server" und Ihre Anwendung ist der "Client". Sie starten also zuerst den Server - sagen Sie dem IDE zum 'Debuggen' - und führen dann den Client aus - ein Code mit der Anweisung settrace. Wenn Ihr python code trifft auf den settrace, verbindet sich mit dem Server - pycharm - und füttert ihn mit den Debugdaten.

Um dies zu erreichen:

1. Kopieren Sie die Bibliothek pydev auf den Remote-Computer.

Also musste ich die Datei von C:\Program Files\JetBrains\PyCharm 1.5.3\pycharm-debug.Egg Auf meinen Linux-Rechner kopieren. Ich habe es auf /home/john/api-dependancies/pycharm-debug.Egg Gesetzt

2. Lege das Ei in den PYTHONPATH

Hoffentlich wissen Sie, dass Sie das Egg nur dann verwenden können, wenn python) es findet. Ich denke, die meisten Leute verwenden easy_install, aber in meinem Beispiel habe ich es explizit hinzugefügt, indem ich Folgendes schreibe:

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

Dies ist nur notwendig, weil ich immer noch keinen Erfolg hatte, ein Ei zu installieren. Dies ist meine Problemumgehung.

. richten Sie die Debug-Server-Konfiguration ein

In PyCharm können Sie den Debug-Server folgendermaßen konfigurieren:

  • Run -> Edit Configurations : öffnet die 'Run/Debug Configurations' Dialog
  • Standard -> "Python Remote Debug": ist die zu verwendende Vorlage
  • geben Sie den lokalen Hostnamen und den Port ein, und Sie möchten wahrscheinlich die Pfadzuordnung verwenden, aber mehr dazu weiter unten ...
  • "IN ORDNUNG"

    Local Host name: bedeutet den Namen des Servers - das ist in meinem Fall der Windows-Host-Rechner - oder eigentlich die IP-Adresse des Windows-Hostcomputers, da der Hostname meinem Remotecomputer nicht bekannt ist. Die virtuelle (entfernte) Maschine muss also in der Lage sein, den Host zu erreichen. Dafür sind ping und netstat gut.

    Port: kann jeder freie, nicht privilegierte Port sein, den Sie mögen. Beispiel: 21000 wird wahrscheinlich nicht verwendet.

    Machen Sie sich vorerst keine Gedanken über die Pfadzuordnungen.

4. Starten Sie den Debug-Server

  • Run -> Debug : Starten Sie den Debug-Server - wählen Sie die Konfiguration, die Sie haben gerade erstellt.

Die Registerkarte Debug-Konsole wird angezeigt und Sie sollten erhalten

 Starting debug server at port 21000

in der Konsole, was bedeutet, dass der ide-Debug-Server darauf wartet, dass Ihr Code eine Verbindung zu ihm herstellt.

5. Code einfügen

Dies funktioniert in einem Unit-Test:

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"

Und in einer Django Webanwendung ist es ein bisschen pingelig, wo Sie es ablegen - scheint erst zu funktionieren, wenn alles andere erledigt ist:

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)

Auch hier ist die IP-Adresse die Box, auf der Sie Pycharm ausführen. Sie sollten in der Lage sein, diese IP-Adresse von der Box aus zu pingen, in der Ihr Code/Ihre Website ausgeführt wird. Der Port ist Ihre Wahl. Stellen Sie nur sicher, dass Sie pycharm angewiesen haben, denselben Port zu überwachen. Und ich fand den suspend=False Weniger problematisch als die Standardeinstellungen von. Er wurde nicht nur sofort angehalten, sodass Sie sich nicht sicher sind, ob er funktioniert, sondern auch versucht, auf stdin/out zu streamen, was Ihnen auch Kummer bereiten könnte.

6. Öffnen Sie die Firewall

Die Windows 7-Firewall blockiert standardmäßig Ihre eingehende Verbindung. Wenn Sie netstat auf dem Remote-Host verwenden, können Sie feststellen, dass SYN_SENT niemals eingerichtet wird, zumindest nicht, bis Sie der Windows-Firewall für die Anwendung "pycharm" eine Ausnahme hinzufügen.

OS/X und Ubuntu verfügen nicht über Firewalls, die durchgeschlagen werden können (standardmäßig hat möglicherweise jemand später eine angewendet).

7. Setzen Sie einen Haltepunkt und führen Sie den Code aus

Wenn alles nach Plan läuft, können Sie einen Haltepunkt setzen - irgendwo nachdem die Settrace gelaufen ist - und die pycharm-Konsole wird angezeigt

Connected to pydev debugger (build 107.386)

auf der Registerkarte "Debugger" beginnt der Variablenstapel zu arbeiten, und Sie können den Code schrittweise durchlaufen.

8. Zuordnungen

Das Mapping teilt pycharm mit, wo es den Quellcode finden kann. Wenn der Debugger also sagt: "Ich führe Zeile 393 der Datei /foo/bar/nang.py aus, kann Pycharm diesen entfernten absoluten Pfad in einen absoluten lokalen Pfad übersetzen ... und Ihnen den Quellcode anzeigen.

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

Erledigt.

108
John Mee

Es ist eigentlich nur eine Notiz, enthält aber einige Informationen, die Stunden sparen können.

  1. Jetzt sofort pip install pydevd hat für mich sowohl auf Ubuntu als auch auf Centos 6 gearbeitet
  2. Wenn Sie wirklich einen Remote-Server debuggen möchten, der sich hinter Firewals und anderen Dingen befindet, können Sie den folgenden Trick anwenden:

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

dadurch kann der Remote-Code eine Verbindung zu Ihrem Computer herstellen, der localhost: 8081 abhört

  1. Wenn der Remote-Debugger nicht starten möchte und sagt, dass er den Socket-Port nicht finden kann, überprüfen Sie Ihre Firewall-Regeln. Beachten Sie, dass die Regel mit "127.0.0.1" nicht mit "localhost" identisch ist.
9
Sergey

Es scheint, dass der Debugger aus irgendeinem Grund mit PyCharm keine Verbindung zu Ihrem Windows-Host herstellen konnte. Hast du keine anderen Nachrichten in stderr? Wenn nicht, versuchen Sie es noch einmal, aber mit sterrToServer = false. Das kann einen wahren Grund dafür anzeigen, warum es keine Verbindung herstellt.

1
Dmitry Trofimov