Python Debugging Tips

Wat zijn uw beste tips voor het debuggen Python?

Lijst niet alleen een bepaalde foutopsporing op zonder te zeggen wat het kan doen.

Gerelateerd


Antwoord 1, Autoriteit 100%

pdb

U kunt de PDB-module gebruiken, pdb.set_trace()overal invoegen en deze functioneert als een breekpunt.

>>> import pdb
>>> a="a string"
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) p a
'a string'
(Pdb)

Doorgaan met uitvoering Gebruik c(of contof continue).

Het is mogelijk om willekeurige pythonuitdrukkingen uit te voeren met behulp van PDB. Als u bijvoorbeeld een fout vindt, kunt u de code corrigeren, typt u vervolgens een type expressie om hetzelfde effect te hebben in de rentecode

IPDB is een versie van PDB voor IPYTHON . Het maakt het gebruik van PDB mogelijk met alle IPYTHON-functies inclusief tabblad Tabblad.

Het is ook mogelijk om PDB in te stellen om automatisch te laten uitvoeren op een niet-ingangs.

pydb is geschreven als een verbeterde versie van PDB. Voordelen?


Antwoord 2, Autoriteit 56%

http://pypi.python.org/pypi/pudb , een volledig scherm , Console-gebaseerde Python Debugger.

Het doel is om alle niceties van moderne GUI-gebaseerde debuggers te bieden in een meer lichtgewicht en toetsenbordvriendelijk pakket. PUDB stelt u in staat om code te debuggen, recht waar u het schrijft en test – in een terminal. Als je hebt gewerkt met de uitstekende (maar tegenwoordig oude) DOS-gebaseerde Turbo Pascal of C-tools, kan de UI van Pudb er vertrouwd uitzien.

Nice voor het debuggen van standalone scripts, voer gewoon

uit

python -m pudb.run my-script.py

Antwoord 3, Autoriteit 29%

Als u PDB gebruikt, kunt u aliassen definiëren voor snelkoppelingen. Ik gebruik deze:

# Ned's .pdbrc
# Print a dictionary, sorted. %1 is the dict, %2 is the prefix for the names.
alias p_ for k in sorted(%1.keys()): print "%s%-15s= %-80.80s" % ("%2",k,repr(%1[k]))
# Print the instance variables of a thing.
alias pi p_ %1.__dict__ %1.
# Print the instance variables of self.
alias ps pi self
# Print the locals.
alias pl p_ locals() local:
# Next and list, and step and list.
alias nl n;;l
alias sl s;;l
# Short cuts for walking up and down the stack
alias uu u;;u
alias uuu u;;u;;u
alias uuuu u;;u;;u;;u
alias uuuuu u;;u;;u;;u;;u
alias dd d;;d
alias ddd d;;d;;d
alias dddd d;;d;;d;;d
alias ddddd d;;d;;d;;d;;d

Antwoord 4, Autoriteit 24%

loggen

Python heeft al een uitstekende ingebouwde logboekmodule . Misschien wilt u de loggen sjabloon hier .

Met de logboekmodule kunt u een niveau van belangrijkheid specificeren; Tijdens het debuggen kunt u alles registreren, terwijl u tijdens de normale bediening alleen de kritische dingen kunt loggen. Je kunt dingen uitschakelen en op.

De meeste mensen gebruiken alleen basisafdrukafschriften om te debuggen en verwijderen vervolgens de afdrukafschriften. Het is beter om ze binnen te laten, maar schakelt ze uit; Dan, wanneer u nog een bug heeft, kunt u alles gewoon opnieuw inschakelen en uw logs bekijken.

Dit kan de best mogelijke manier zijn om fouten op te sporen in programma’s die dingen snel moeten doen, zoals netwerkprogramma’s die moeten reageren voordat de andere kant van de netwerkverbinding een time-out krijgt en weggaat. Je hebt misschien niet veel tijd om een ​​debugger in één stap uit te voeren; maar je kunt je code gewoon laten lopen en alles loggen, dan de logs doornemen en uitzoeken wat er echt gebeurt.

EDIT: de oorspronkelijke URL voor de sjablonen was: http://aymanh.com/python-debugging- technieken

Deze pagina ontbreekt, dus heb ik deze vervangen door een verwijzing naar de momentopname die is opgeslagen op archive.org: http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-techniques

Voor het geval het weer verdwijnt, zijn hier de sjablonen die ik noemde. Dit is code uit de blog; Ik heb het niet geschreven.

import logging
import optparse
LOGGING_LEVELS = {'critical': logging.CRITICAL,
                  'error': logging.ERROR,
                  'warning': logging.WARNING,
                  'info': logging.INFO,
                  'debug': logging.DEBUG}
def main():
  parser = optparse.OptionParser()
  parser.add_option('-l', '--logging-level', help='Logging level')
  parser.add_option('-f', '--logging-file', help='Logging file name')
  (options, args) = parser.parse_args()
  logging_level = LOGGING_LEVELS.get(options.logging_level, logging.NOTSET)
  logging.basicConfig(level=logging_level, filename=options.logging_file,
                      format='%(asctime)s %(levelname)s: %(message)s',
                      datefmt='%Y-%m-%d %H:%M:%S')
  # Your program goes here.
  # You can access command-line arguments using the args variable.
if __name__ == '__main__':
  main()

En hier is zijn uitleg over het gebruik van het bovenstaande. Nogmaals, ik krijg hier niet de eer voor:


Standaard drukt de logboekmodule kritieke, fout- en waarschuwingsberichten af. Om dit te wijzigen zodat alle niveaus worden afgedrukt, gebruikt u:

$ ./your-program.py --logging=debug

Om logberichten naar een bestand met de naam debug.log te sturen, gebruik je:

$ ./your-program.py --logging-level=debug --logging-file=debug.log


Antwoord 5, autoriteit 14%

Het is mogelijk om af te drukken wat Python-regels zijn uitgevoerd(bedankt Geo!). Dit heeft een willekeurig aantal toepassingen, u kunt het bijvoorbeeld wijzigen om te controleren wanneer bepaalde functies worden aangeroepen of iets toevoegen als ## zodat het alleen bepaalde regels volgt.

code.interact neemt je mee naar een interactieve console

import code; code.interact(local=locals())

Als je gemakkelijk toegang wilt hebben tot je consolegeschiedenis, kijk dan op: “Mag ik een geschiedenis mechanisme zoals in de schaal?” (zal er naar moeten kijken).

Automatisch aanvullen kan worden ingeschakeld voor de interpreter.


Antwoord 6, autoriteit 14%

ipdb is als pdb, met het geweldige van ipython.


Antwoord 7, autoriteit 12%

printverklaringen

  • Sommige mensen raden een functie debug_printaan in plaats van printen om deze eenvoudig uit te schakelen
  • De module pprintis van onschatbare waarde voor complexe structuren

Antwoord 8, autoriteit 12%

de voor de hand liggende manier om een ​​script te debuggen

python -m pdb script.py
  • handig als dat script een uitzondering maakt
  • handig als het virtualenv- en pdb-commando niet wordt uitgevoerd met de venvs python-versie.

als je niet precies weet waar dat script is

python -m pdb ``which <python-script-name>``

Antwoord 9, autoriteit 11%

PyDev

PyDevheeft een redelijk goede interactieve debugger. Het heeft horloge-uitdrukkingen, hover-to-evaluate, thread- en stack-lijsten en (bijna) alle gebruikelijke voorzieningen die u van een moderne visuele debugger mag verwachten. Je kunt zelfs een lopend proces koppelen en op afstand debuggen.

Net als andere visuele debuggers vind ik het echter vooral nuttig voor eenvoudige problemen, of voor zeer gecompliceerde problemen nadat ik al het andere heb geprobeerd. Ik doe nog steeds het meeste zware werk met houtkap.


Antwoord 10, autoriteit 11%

Als u bekend bent met Visual Studio, is Python Tools for Visual Studiowat u zoekt.


Antwoord 11, autoriteit 9%

Winpdbis erg leuk, en in tegenstelling tot zijn naam is het volledig platformonafhankelijk.

Het heeft een erg mooie op prompts gebaseerde enGUI debugger en ondersteunt foutopsporing op afstand.


Antwoord 12, autoriteit 5%

In Vim heb ik deze drie bindingen:

map <F9> Oimport rpdb2; rpdb2.start_embedded_debugger("asdf") #BREAK<esc>
map <F8> Ofrom nose.tools import set_trace; set_trace() #BREAK<esc>
map <F7> Oimport traceback, sys; traceback.print_exception(*sys.exc_info()) #TRACEBACK<esc>

rpdb2is een externe Python Debugger, die kan worden gebruikt met WinPDB, een solide grafische debugger. Omdat ik weet dat je het zult vragen, kan het alles wat ik van een grafische debugger verwacht 🙂

Ik gebruik pdbvan nose.toolszodat ik zowel eenheidstests als normale code kan debuggen.

Ten slotte zal de F7-toewijzing een traceback afdrukken (vergelijkbaar met het soort dat u krijgt wanneer een uitzondering naar de bovenkant van de stapel bubbelt). Ik heb het meer dan een paar keer echt nuttig gevonden.


Antwoord 13, autoriteit 3%

Definiëren van bruikbare repr() methoden voor uw klassen (zodat u kunt zien wat een object is) en het gebruik van repr() of “%r” % (…) of “… {0!r}..”.format(…) in uw foutopsporingsberichten/logs is IMHO een sleutel tot efficiënt debuggen.

Ook zullen de debuggers die in andere antwoorden worden genoemd, gebruik maken van de repr()-methoden.


Antwoord 14

Een stacktracering ophalen van een draaiende Python-toepassing

Er zijn hierverschillende trucs. Deze omvatten

  • Inbreken in een interpreter/een stacktracering afdrukken door een signaal te sturen
  • Een stacktracering uit een onvoorbereid Python-proces halen
  • De tolk uitvoeren met vlaggen om het nuttig te maken voor foutopsporing

Antwoord 15

Als je niet graag tijd doorbrengt in debuggers (en de slechte bruikbaarheid van de pdb-opdrachtregelinterface niet op prijs stelt), kun je de uitvoering traceeren later te analyseren. Bijvoorbeeld:

python -m trace -t setup.py install > execution.log

Hiermee wordt alle bronregel van de uitvoering van setup.py installnaar execution.loggedumpt.

Om het gemakkelijker te maken om traceringsuitvoer aan te passen en uw eigen tracers te schrijven, heb ik enkele stukjes code samengevoegd in xtracemodule (publiek domein).


Antwoord 16

Waar mogelijk debug ik met behulp van M-x pdbin emacs voor foutopsporing op bronniveau.


Antwoord 17

Er is een volledige online cursus genaamd “Software Debugging” door Andreas Zeller over Udacity, boordevol tips over debuggen:

Cursusoverzicht

In deze les leer je hoe je programma’s systematisch kunt debuggen, hoe
om het foutopsporingsproces te automatiseren en verschillende geautomatiseerde
foutopsporingstools in Python.

Waarom deze cursus volgen?

Aan het einde van deze cursus heb je een goed begrip van:
systematische debugging, zal debugging weten te automatiseren en zal
hebben verschillende functionele debugging-tools in Python gebouwd.

Vereisten en vereisten

Basiskennis van programmeren en Python op het niveau van Udacity
CS101 of beter is vereist. Basiskennis van objectgericht
programmeren is handig.

Sterk aanbevolen.


Antwoord 18

als je een mooie grafische manier wilt om je call-stack op een leesbare manier af te drukken, bekijk dan dit hulpprogramma: https: //github.com/joerick/pyinstrument

Uitvoeren vanaf de opdrachtregel:

python -m pyinstrument myscript.py [args...]

Uitvoeren als module:

from pyinstrument import Profiler
profiler = Profiler()
profiler.start()
# code you want to profile
profiler.stop()
print(profiler.output_text(unicode=True, color=True))

Uitvoeren met django:

Voeg gewoon pyinstrument.middleware.ProfilerMiddlewaretoe aan MIDDLEWARE_CLASSESen voeg vervolgens ?profiletoe aan het einde van de verzoek-URL om de profiler te activeren.

Other episodes