true - python debugging tutorial




Wie in Django debuggen, der gute Weg? (18)

Aus meiner Sicht könnten wir Common- Code-Debugging- Aufgaben in drei unterschiedliche Nutzungsmuster unterteilen:

  1. Etwas hat eine Ausnahme django-extensions : django-extensions 'Werkzeug Debugger zur Rettung. Die Fähigkeit, benutzerdefinierten Code auf allen Tracestufen auszuführen, ist ein Mörder. Und wenn Sie völlig stecken bleiben, können Sie einen Gist erstellen, um ihn mit nur einem Klick zu teilen.
  2. Seite wird gerendert, aber das Ergebnis ist falsch : wieder rockt Werkzeug. Um einen Unterbrechungspunkt im Code zu setzen, geben Sie einfach assert False an der Stelle ein, an der Sie anhalten möchten.
  3. Code funktioniert falsch , aber der schnelle Blick hilft nicht. Höchstwahrscheinlich ein algorithmisches Problem. Seufzer. Dann pudb ich normalerweise einen Konsolen-Debugger pudb : import pudb; pudb.set_trace() import pudb; pudb.set_trace() . Der Hauptvorteil gegenüber [i] pdb ist, dass PuDB (während du aussiehst, als ob du in den 80ern bist) das Einstellen von benutzerdefinierten Uhrausdrücken zum Kinderspiel macht. Das Debuggen von verschachtelten Schleifen ist mit einer GUI viel einfacher.

Ah, ja, die Probleme der Vorlagen. Das häufigste (für mich und meine Kollegen) Problem ist ein falscher Kontext: entweder haben Sie keine Variable oder Ihre Variable hat kein Attribut. Wenn Sie die Debug-Symbolleiste verwenden , prüfen Sie den Kontext im Bereich "Vorlagen". Wenn dies nicht ausreicht, legen Sie nach dem Ausfüllen des Kontexts eine Unterbrechung im Code Ihrer Ansichten fest.

So geht es.

Also fing ich an, in Python und später Django . Das erste Mal war es schwer, Rückverfolgungen zu sehen und herauszufinden, was ich falsch gemacht habe und wo der Syntaxfehler war. Einige Zeit ist jetzt vergangen und auf dem Weg dorthin habe ich eine Routine im Debuggen meines Django-Codes bekommen. Da dies zu Beginn meiner Programmierkenntnisse getan wurde, setzte ich mich hin und fragte mich, ob das, was ich tat, ineffektiv war und schneller erledigt werden konnte. Normalerweise gelingt es mir, die Fehler in meinem Code zu finden und zu korrigieren, aber ich frage mich, ob ich es schneller machen sollte?

Normalerweise verwende ich nur die Debug-Informationen, die Django bei Aktivierung gibt. Wenn die Dinge so enden, wie ich es mir vorstelle, breche ich den Code-Fluss viel mit einem Syntaxfehler ab und schaue mir die Variablen an diesem Punkt im Fluss an, um herauszufinden, wo der Code etwas anderes tut, als ich wollte.

Aber kann das verbessert werden? Gibt es einige gute Tools oder bessere Möglichkeiten, um Ihren Django-Code zu debuggen?


Der einfachste Weg, Python zu debuggen - insbesondere für Programmierer, die an Visual Studio gewöhnt sind - ist die Verwendung von PTVS (Python Tools für Visual Studio). Die Schritte sind einfach:

  1. Downloaden und installieren Sie es von http://pytools.codeplex.com/
  2. Setze Haltepunkte und drücke F5.
  3. Ihr Haltepunkt ist getroffen, Sie können die Variablen so einfach anzeigen / ändern wie das Debuggen von C # / C ++ - Programmen.
  4. Das ist alles :)

Wenn Sie Django mit PTVS debuggen möchten, müssen Sie Folgendes tun:

  1. Setzen Sie unter Projekteinstellungen - Registerkarte Allgemein "Startdatei" auf "manage.py", den Einstiegspunkt des Django-Programms.
  2. Setzen Sie unter Projekteinstellungen - Registerkarte Debug die Option "Skriptargumente" auf "runserver --noreload". Der entscheidende Punkt ist hier "--noreload". Wenn Sie es nicht setzen, werden Ihre Breakpoints nicht getroffen.
  3. Genieß es.

Ein kleiner Quickie für Vorlagen-Tags:

@register.filter 
def pdb(element):
    import pdb; pdb.set_trace()
    return element

Nun können Sie in einer Vorlage {{ template_var|pdb }} eingeben und eine pdb-Sitzung eingeben (vorausgesetzt, Sie führen den lokalen devel-Server aus), wo Sie das element nach Herzenslust untersuchen können.

Es ist eine sehr gute Möglichkeit zu sehen, was mit Ihrem Objekt passiert ist, wenn es bei der Vorlage ankommt.


Ein zusätzlicher Vorschlag.

Sie können nosetests und pdb zusammen verwenden, indem pdb.set_trace() in Ihren Ansichten pdb.set_trace() manuell pdb.set_trace() . Der Vorteil ist, dass Sie Fehlerbedingungen beim ersten Start beobachten können, möglicherweise in Code von Drittanbietern.

Hier ist ein Fehler für mich heute.

TypeError at /db/hcm91dmo/catalog/records/

render_option() argument after * must be a sequence, not int

....


Error during template rendering

In template /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/crispy_forms/templates/bootstrap3/field.html, error at line 28
render_option() argument after * must be a sequence, not int
18  
19          {% if field|is_checkboxselectmultiple %}
20              {% include 'bootstrap3/layout/checkboxselectmultiple.html' %}
21          {% endif %}
22  
23          {% if field|is_radioselect %}
24              {% include 'bootstrap3/layout/radioselect.html' %}
25          {% endif %}
26  
27          {% if not field|is_checkboxselectmultiple and not field|is_radioselect %}
28  

      {% if field|is_checkbox and form_show_labels %}

Nun, ich weiß, das bedeutet, dass ich den Konstruktor für das Formular verpatzt habe, und ich habe sogar eine gute Vorstellung davon, welches Feld ein Problem ist. Aber kann ich pdb verwenden, um zu sehen, welche knusprigen Formen sich in einer Vorlage beschweren?

Ja, ich kann. Verwenden Sie die Option --pdb auf Nasetests:

tests$ nosetests test_urls_catalog.py --pdb

Sobald ich irgendeine Ausnahme (einschließlich der elegant behandelten) getroffen habe, stoppt pdb, wo es passiert und ich kann mich umsehen.

  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 537, in __str__
    return self.as_widget()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 593, in as_widget
    return force_text(widget.render(name, self.value(), attrs=attrs))
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 513, in render
    options = self.render_options(choices, [value])
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 543, in render_options
    output.append(self.render_option(selected_choices, *option))
TypeError: render_option() argument after * must be a sequence, not int
INFO lib.capture_middleware log write_to_index(http://localhost:8082/db/hcm91dmo/catalog/records.html)
INFO lib.capture_middleware log write_to_index:end
> /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py(543)render_options()
-> output.append(self.render_option(selected_choices, *option))
(Pdb) import pprint
(Pdb) pprint.PrettyPrinter(indent=4).pprint(self)
<django.forms.widgets.Select object at 0x115fe7d10>
(Pdb) pprint.PrettyPrinter(indent=4).pprint(vars(self))
{   'attrs': {   'class': 'select form-control'},
    'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]],
    'is_required': False}
(Pdb)         

Nun, es ist klar, dass mein Wahlargument für den knusprigen Feldkonstruktor war, da es eine Liste innerhalb einer Liste war und nicht eine Liste / Tupel von Tupeln.

 'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]]

Die nette Sache ist, dass diese pdb in knackigem Code stattfindet, nicht meins, und ich musste es nicht manuell einfügen.


Es gibt ein paar Tools, die gut zusammenarbeiten und Ihre Debugging-Aufgabe erleichtern.

Am wichtigsten ist die Django-Debug-Symbolleiste .

Dann benötigen Sie eine gute Protokollierung mit der Python- logging . Sie können die Protokollierungsausgabe an eine Protokolldatei senden, eine einfachere Option ist das Senden der Protokollausgabe an firepython . Um dies zu verwenden, müssen Sie den Firefox-Browser mit der firebug Erweiterung verwenden. Firepython enthält ein Firebug-Plugin, das jede serverseitige Protokollierung in einer Firebug-Registerkarte anzeigt.

Firebug selbst ist auch entscheidend für das Debugging der Javascript-Seite jeder App, die Sie entwickeln. (Angenommen, Sie haben natürlich JS-Code).

Ich mochte auch django-viewtools zum Debuggen von Ansichten interaktiv mit pdb, aber ich benutze es nicht so sehr.

Es gibt mehr nützliche Tools wie Dozer zum Aufspüren von Speicherlecks (es gibt auch andere gute Vorschläge in Antworten hier auf SO für die Speicherverfolgung).


Es gibt eine Reihe von Möglichkeiten, dies zu tun, aber am einfachsten ist es, einfach den Python-Debugger zu verwenden . Fügen Sie einfach folgende Zeile in eine Django-View-Funktion ein:

import pdb; pdb.set_trace()

Wenn Sie versuchen, diese Seite in Ihrem Browser zu laden, wird der Browser hängen bleiben und Sie werden aufgefordert, das Debuggen des tatsächlich ausgeführten Codes fortzusetzen.

Es gibt jedoch andere Möglichkeiten (ich empfehle sie nicht):

* return HttpResponse({variable to inspect})

* print {variable to inspect}

* raise Exception({variable to inspect})

Aber der Python-Debugger (pdb) wird für alle Arten von Python-Code dringend empfohlen. Wenn Sie bereits mit pdb arbeiten, sollten Sie sich auch IPDB , die ipython zum Debuggen verwendet.

Etwas nützlichere Erweiterung für pdb sind

pdb++ , vorgeschlagen von Antash .

pudb , vorgeschlagen von PatDuJour .

Verwenden des Python-Debuggers in Django , vorgeschlagen von Seafangs .


Fast alles wurde bisher erwähnt, daher werde ich nur hinzufügen, dass anstelle von pdb.set_trace() ipdb.set_trace () verwendet werden kann, das iPython verwendet und daher leistungsfähiger ist (Autocomplete und andere Goodies). Dies erfordert ipdb-Paket, so dass Sie nur pip install ipdb


Hinzufügen von import pdb; pdb.set_trace() import pdb; pdb.set_trace() an der entsprechenden Zeile im Python-Code und führen Sie es aus. Die Ausführung wird mit einer interaktiven Shell beendet. In der Shell können Sie Python-Code ausführen (dh Variablen drucken) oder Befehle verwenden wie:

  • c Ausführung fortsetzen
  • n Schritt zur nächsten Zeile innerhalb derselben Funktion
  • s zur nächsten Zeile dieser Funktion oder einer aufgerufenen Funktion springen
  • q Beenden Sie den Debugger / die Ausführung

Siehe auch: https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28


Ich benutze PyCharm (gleiche Pydev-Engine wie Eclipse). Wirklich hilft mir, visuell in der Lage zu sein, durch meinen Code zu gehen und zu sehen, was passiert.


Ich benutze PyCharm und PyCharm . Es hat mich ein bisschen gekostet, aber ich muss sagen, dass der Vorteil, dass ich davon ausgehe, unbezahlbar ist. Ich habe versucht, von der Konsole zu debuggen, und ich gebe den Leuten eine Menge Kredit, die das tun können, aber für mich ist es in der Lage, meine Anwendung (en) visuell zu debuggen.

Ich muss jedoch sagen, dass PyCharm viel Speicher braucht. Aber andererseits ist nichts Gutes frei im Leben. Sie kamen gerade mit ihrer neuesten Version 3. Sie spielt auch sehr gut mit Django, Flask und Google AppEngine. Alles in allem würde ich sagen, dass es ein sehr nützliches Werkzeug für jeden Entwickler ist.

Wenn Sie es noch nicht verwenden, würde ich empfehlen, die Testversion für 30 Tage zu bekommen, um sich die Leistungsfähigkeit von PyCharm anzuschauen. Ich bin mir sicher, dass auch andere Tools wie Aptana verfügbar sind. Aber ich schätze ich mag auch einfach die Art, wie PyCharm aussieht. Ich fühle mich sehr wohl dabei, meine Apps dort zu debuggen.


Ich empfehle epdb (Extended Python Debugger).

https://bitbucket.org/dugan/epdb

Eine Sache, die ich an epdb zum Debuggen von Django oder anderen Python-Webservern liebe, ist der Befehl epdb.serve (). Dies legt eine Ablaufverfolgung fest und dient diesem auf einem lokalen Port, mit dem Sie eine Verbindung herstellen können. Typischer Anwendungsfall:

Ich habe eine Sichtweise, die ich Schritt für Schritt durchgehen möchte. Ich füge folgendes an der Stelle ein, an der ich den Trace setzen möchte.

import epdb; epdb.serve()

Sobald dieser Code ausgeführt wird, öffne ich einen Python-Interpreter und verbinde mich mit der Serving-Instanz. Ich kann alle Werte analysieren und den Code mit den Standard-pdb-Befehlen wie n, s usw. durchlaufen.

In [2]: import epdb; epdb.connect()
(Epdb) request
<WSGIRequest
path:/foo,
GET:<QueryDict: {}>, 
POST:<QuestDict: {}>,
...
>
(Epdb) request.session.session_key
'i31kq7lljj3up5v7hbw9cff0rga2vlq5'
(Epdb) list
 85         raise some_error.CustomError()
 86 
 87     # Example login view
 88     def login(request, username, password):
 89         import epdb; epdb.serve()
 90  ->     return my_login_method(username, password)
 91
 92     # Example view to show session key
 93     def get_session_key(request):
 94         return request.session.session_key
 95

Und jede Menge mehr, die Sie jederzeit über epdb help schreiben können.

Wenn Sie mehrere epdb-Instanzen gleichzeitig bereitstellen oder verbinden möchten, können Sie den Port angeben, der überwacht werden soll (Standard ist 8080). Ie

import epdb; epdb.serve(4242)

>> import epdb; epdb.connect(host='192.168.3.2', port=4242)

Der Host ist standardmäßig auf "localhost" eingestellt, wenn er nicht angegeben wird. Ich habe es hier eingefügt, um zu demonstrieren, wie Sie damit etwas anderes als eine lokale Instanz wie einen Entwicklungsserver in Ihrem lokalen LAN debuggen können. Offensichtlich sollten Sie darauf achten, dass der Set-Trace niemals auf Ihren Produktionsserver gelangt!

import epdb; epdb.set_trace() , Sie können immer noch das gleiche wie die angenommene Antwort mit epdb ( import epdb; epdb.set_trace() ), aber ich wollte die Serve-Funktionalität hervorheben, da ich sie so nützlich fand.


Ich finde Visual Studio Code ist großartig zum Debuggen von Django-Apps. Die Standardparameter python launch.json führen python manage.py mit dem angehängten Debugger aus, so dass Sie Breakpoints setzen und Ihren Code nach python manage.py durchlaufen können.


Ich habe gerade gefunden wdb ( http://www.rkblog.rk.edu.pl/w/p/debugging-python-code-browser-wdb-debugger/?goback=%2Egde_25827_member_255996401 ). Es hat eine ziemlich nette Benutzeroberfläche / GUI mit all den Schnickschnack. Autor sagt das über wdb -

"Es gibt IDEs wie PyCharm, die ihre eigenen Debugger haben. Sie bieten ähnliche oder gleiche Eigenschaften an ... Um sie zu benutzen, müssen Sie diese spezifischen IDEs verwenden (und einige davon sind dann nicht frei oder nicht für alle verfügbar) Plattformen). Wählen Sie das richtige Werkzeug für Ihre Bedürfnisse. "

Ich dachte, ich würde es einfach weitergeben.

Auch ein sehr hilfreicher Artikel über Python-Debugger: https://zapier.com/engineering/debugging-python-boss/

Wenn Sie einen schönen grafischen Ausdruck Ihres Call-Stacks in Django sehen möchten, gehen Sie zur Kasse: https://github.com/joerick/pyinstrument . Fügen Sie pyinstrument.middleware.ProfilerMiddleware zu MIDDLEWARE_CLASSES hinzu, und fügen Sie am Ende der Anforderungs-URL ein Profil hinzu, um den Profiler zu aktivieren.

Kann pininstrument auch über die Befehlszeile ausführen oder als Modul importieren.


Ich mag Antworten, die ich direkt kopieren kann. Und ich mag IPython:

pip install ipdb

In deinem Code:

import ipdb; ipdb.set_trace()


Manchmal, wenn ich in einer bestimmten Methode erkunden und pdb beschwören einfach zu umständlich ist, würde ich hinzufügen:

import IPython; IPython.embed()

IPython.embed() startet eine IPython-Shell, die von dem Punkt, an dem Sie sie aufrufen, Zugriff auf die lokalen Variablen hat.


Während der Entwicklung eine schnelle hinzufügen

assert False, value

kann helfen, Probleme in Ansichten oder anderswo zu diagnostizieren, ohne einen Debugger verwenden zu müssen.






debugging