Hoe stap je door Python-code om problemen op te lossen?

In Java/C# kun je gemakkelijk door de code stappen om te achterhalen wat er mis kan gaan, en IDE’s maken dit proces zeer gebruiksvriendelijk.

Kun je op dezelfde manier door Python-code traceren?


Antwoord 1, autoriteit 100%

Ja! Er is een Python debugger genaamd pdbom dat te doen!

Je kunt een Python-programma starten via pdbdoor pdb myscript.pyof python -m pdb myscript.pyte gebruiken.

Er zijn een paar commando’s die u vervolgens kunt geven, die zijn gedocumenteerd in de pdbpagina.

Enkele handige om te onthouden zijn:

  • b: stel een breekpunt in
  • c: ga door met debuggen totdat je een breekpunt bereikt
  • s: stap door de code
  • n: om naar de volgende regel code te gaan
  • l: lijst broncode voor het huidige bestand (standaard: 11 regels inclusief de regel die wordt uitgevoerd)
  • u: naar boven navigeren in een stapelframe
  • d: navigeer door een stapelframe
  • p: om de waarde van een uitdrukking in de huidige context af te drukken

Als u geen opdrachtregeldebugger wilt gebruiken, kunnen sommige IDE’s zoals Pydev, Wing IDEof PyCharmhebben een GUI debugger. Wing en PyCharm zijn commerciële producten, maar Wing heeft een gratis “Persoonlijke” editie en PyCharm heeft een gratis community-editie.


Antwoord 2, autoriteit 19%

Door Python Interactive Debugger ‘pdb’ te gebruiken

De eerste stap is om de Python-interpreter in de foutopsporingsmodus te laten gaan.

a. Van de opdrachtregel

Meest rechtse weg, uitgevoerd vanaf de opdrachtregel, van Python-tolk

$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)

b. Binnen de tolk

tijdens het ontwikkelen van vroege versies van modules en om het iteratief te experimenteren.

$ python
Python 2.7 (r27:82508, Jul  3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)

c. Van binnenuit uw programma

Voor een groot project en langlopende module, kan het debuggen van binnenuit het programma starten met behulp van
Import PDB en Set_trace ()
zoals dit:

#!/usr/bin/env python
# encoding: utf-8
#
import pdb
class MyObj(object):
    count = 5
    def __init__(self):
        self.count= 9
    def go(self):
        for i in range(self.count):
            pdb.set_trace()
            print i
        return
if __name__ == '__main__':
    MyObj(5).go()

stapsgewijs debuggen om in meer interne

te gaan

  1. Voer de volgende verklaring uit … met “n” (volgende)

  2. Herhaal het laatste foutopsporingsopdracht … met Enter

  3. Sluit het allemaal … met “Q” (QUIT)

  4. De waarde van variabelen afdrukken … met “P” (Print)

    a) p a

  5. De (Pdb)-prompt uitschakelen… met “c”(verder)

  6. Zien waar je bent… met “l”(lijst)

  7. In subroutines stappen… met “s”(stap in)

  8. Doorgaan… maar gewoon tot het einde van de huidige subroutine… met “r”(return)

  9. Wijs een nieuwe waarde toe

    a) !b = “B”

  10. Stel een breekpunt in

    a) regelnummer breken

    b) functienaam breken

    c) breek bestandsnaam:regelnummer

  11. Tijdelijk onderbrekingspunt

    a) tbreak regelnummer

  12. Voorwaardelijk breekpunt

    a) regelnummer breken, voorwaarde

Opmerking:**Al deze opdrachten moeten worden uitgevoerd vanaf **pdb

Voor diepgaande kennis, zie:-

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09 /10/debugging-in-python/


Antwoord 3, autoriteit 14%

Er is een module met de naam ‘pdb’ in python. Bovenaan je python-script doe je

import pdb
pdb.set_trace()

en u komt in de foutopsporingsmodus. Je kunt ‘s’ gebruiken om te stappen, ‘n’ om de volgende regel te volgen, vergelijkbaar met wat je zou doen met ‘gdb’ debugger.


Antwoord 4, autoriteit 8%

Vanaf Python 3.7 kunt u het breakpoint()ingebouwde functie om de debugger in te voeren:

foo()
breakpoint()  # drop into the debugger at this point
bar()

Standaard, breakpoint()importeren pdben oproep pdb.set_trace(). U kunt echter debuggengedrag controleren via sys.breakpointhook()en gebruik van de milieuvariabele PYTHONBREAKPOINT.

Zie pep 553 voor meer informatie.


Antwoord 5, Autoriteit 4%

IPDB (IPYTHON Debugger)

IPDB voegt IPYHON-functionaliteit toe aan PDB, met de volgende enorme verbeteringen:

  • tabblad voltooien
  • Toon meer contextlijnen
  • Syntaxis Markeer

Veel zoals PDG, is IPDB nog steeds verre van perfect en volledig rudimentair in vergelijking met GDB, maar het is al een enorme verbetering ten opzichte van PDB.

Gebruik is analoog aan pdb, installeer het gewoon met:

python3 -m pip install --user ipdb

en vervolgens toe te voegen aan de lijn die u wilt stap debuggen van:

__import__('ipdb').set_trace(context=21)

Waarschijnlijk wil je daarvoor een snelkoppeling vanuit je editor toevoegen, bijv. voor Vim snipmateik heb:

snippet ipd
    __import__('ipdb').set_trace(context=21)

zodat ik gewoon ipd<tab>kan typen en het wordt uitgebreid naar het breekpunt. Dan is het verwijderen eenvoudig met ddomdat alles op één regel staat.

context=21verhoogt het aantal contextregels zoals uitgelegd op: Hoe kan ik ervoor zorgen dat ipdb meer regels context toont tijdens het debuggen?

Als alternatief kunt u ook programma’s vanaf het begin debuggen met:

ipdb3 main.py

maar dat wil je over het algemeen niet doen omdat:

  • je zou alle functie- en klassedefinities moeten doorlopen terwijl Python die regels leest
  • Ik weet niet hoe ik de contextgrootte daar moet instellen zonder ipdb te hacken. Patch om het toe te staan: https://github.com/gotcha/ipdb/pull/155

Of als alternatief, zoals in raw pdb 3.2+ kunt u enkele onderbrekingspunten instellen vanaf de opdrachtregel:

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

hoewel -c com de een of andere reden kapot is: https:// github.com/gotcha/ipdb/issues/156

python -m modulefoutopsporing is gevraagd op: Hoe debug je een Python-module die wordt uitgevoerd met python -m vanaf de opdrachtregel?en aangezien Python 3.7 kan worden gedaan met:

python -m pdb -m my_module

Ernstige ontbrekende functies van zowel pdb als ipdb in vergelijking met GDB:

IPdb-specifieke ergernissen:

Getest in Ubuntu 16.04, ipdb==0.11, Python 3.5.2.


Antwoord 6, autoriteit 2%

Er bestaat tegenwoordig een breakpoint()methode, die import pdb; pdb.set_trace().

Het heeft ook verschillende nieuwe functies, zoals mogelijke omgevingsvariabelen.


Antwoord 7, autoriteit 2%

Python Tutoris een online eenstaps debugger bedoeld voor beginners. U kunt code invoeren op de pagina bewerkenen vervolgens op “Uitvoering visualiseren” klikken om het te starten hardlopen.

Het ondersteunt onder andere:

Het ondersteunt echter ook niet veel dingen, bijvoorbeeld:

  • Bestanden lezen/schrijven – gebruik io.StringIOen io.BytesIOin plaats daarvan: demo
  • Code die te groot is, te lang duurt of te veel variabelen of objecten definieert
  • Opdrachtregelargumenten
  • Veel standaard bibliotheekmodules zoals argparse, csv, enum, html, os, struct, zwakkeref…

Antwoord 8

Als je een Java/C#-achtergrond hebt, denk ik dat je het beste kunt doen om Eclipsete gebruiken met Pydev. Dit geeft je een volledig functionele IDE met ingebouwde debugger. Ik gebruik het ook met django.


Antwoord 9

https://wiki.python.org/moin/PythonDebuggingTools

pudb is een goede vervanging voor pdb


Antwoord 10

PyCharm is een IDE voor Python die een debugger bevat. Bekijk deze YouTube-video voor een introductie over het gebruik van de debugger van PyCharm om door code te stappen.

PyCharm-zelfstudie – Debug python-code met PyCharm

Opmerking: dit is niet bedoeld als goedkeuring of recensie. PyCharm is een commercieel product waarvoor je moet betalen, maar het bedrijf biedt wel een gratis licentie aan studenten en docenten, evenals een “lichtgewicht” Community-versie die gratis en open-source is.


Antwoord 11

Als je een IDE met geïntegreerde debugger wilt, probeer dan PyScripter.


Antwoord 12

Programmatisch stappen en traceren door python-code is ook mogelijk (en het is gemakkelijk!). Bekijk de sys.settrace()documentatie voor meer details. Ook hieris een tutorial om u op weg te helpen.


Antwoord 13

Visual Studio met PTVS zou een optie voor u kunnen zijn: http://www.hanselman.com /blog/OneOfMicrosoftsBestKeptSecretsPythonToolsForVisualStudioPTVS.aspx


Antwoord 14

Laten we eens kijken wat breakpoint()voor u kan doen in 3.7+.

Ik heb ipdben pdbpp, beide verbeterde debuggers, via

pip install pdbpp
pip install ipdb

Mijn testscript doet eigenlijk niet veel, roept gewoon breakpoint()aan.

#test_188_breakpoint.py
myvars=dict(foo="bar")
print("before breakpoint()")
breakpoint()   # 👈
print(f"after breakpoint myvars={myvars}")

breakpoint() is gekoppeld aan de PYTHONBREAKPOINT-omgeving variabel.

CASE 1: breekpunt() uitschakelen

Je kunt de variabele zoals gewoonlijk via bashinstellen

export PYTHONBREAKPOINT=0

Hiermee wordt breakpoint() uitgeschakeld waar het niets doet (zolang je sys.breakpointhook()niet hebt gewijzigd, wat buiten het bestek van dit antwoord valt).

Zo ziet een uitvoering van het programma eruit:

(venv38) myuser@explore$ export PYTHONBREAKPOINT=0
(venv38) myuser@explore$ python test_188_breakpoint.py
before breakpoint()
after breakpoint myvars={'foo': 'bar'}
(venv38) myuser@explore$

Niet gestopt, omdat ik het breekpunt heb uitgeschakeld. Iets dat pdb.set_trace()niet kan 😀😀😀!

CASE 2: het standaard pdb-gedrag gebruiken:

Laten we nu PYTHONBREAKPOINTuitschakelen, wat ons terugbrengt naar normaal, ingeschakeld breekpuntgedrag (het is alleen uitgeschakeld als 0niet leeg is).

(venv38) myuser@explore$ unset PYTHONBREAKPOINT
(venv38) myuser@explore$ python test_188_breakpoint.py
before breakpoint()
[0] > /Users/myuser/kds2/wk/explore/test_188_breakpoint.py(6)<module>()
-> print(f"after breakpoint myvars={myvars}")
(Pdb++) print("pdbpp replaces pdb because it was installed")
pdbpp replaces pdb because it was installed
(Pdb++) c
after breakpoint myvars={'foo': 'bar'}

Het stopte, maar ik kreeg eigenlijk pdbppomdat het pdbvolledig vervangt tijdens de installatie. Als ik pdbppde-installeerde, zou ik terug zijn naar de normale pdb.

Opmerking: een standaard pdb.set_trace()zou me nog steeds pdbpp

opleveren

CASE 3: een aangepaste debugger aanroepen

Maar laten we in plaats daarvan ipdbbellen. Deze keer kunnen we, in plaats van de omgevingsvariabele in te stellen, bashgebruiken om het alleen voor deze ene opdracht in te stellen.

(venv38) myuser@explore$ PYTHONBREAKPOINT=ipdb.set_trace py test_188_breakpoint.py
before breakpoint()
> /Users/myuser/kds2/wk/explore/test_188_breakpoint.py(6)<module>()
      5 breakpoint()
----> 6 print(f"after breakpoint myvars={myvars}")
      7
ipdb> print("and now I invoked ipdb instead")
and now I invoked ipdb instead
ipdb> c
after breakpoint myvars={'foo': 'bar'}

In wezen, wat het doet, als we kijken naar $PYTHONBREAKPOINT:

from ipdb import set_trace  # function imported on the right-most `.`
set_trace()

Nogmaals, veel slimmer dan een gewone oude pdb.set_trace() 😀😀😀

in de praktijk? Ik zou waarschijnlijk genoegen nemen met een debugger.

Zeg dat ik altijd ipdb wil, zou ik:

  • exporthet via .profileof iets dergelijks.
  • uitschakelen per opdracht, zonder de normale waarde te wijzigen

Voorbeeld (pytesten debuggers zorgen vaak voor ongelukkige koppels):

(venv38) myuser@explore$ export PYTHONBREAKPOINT=ipdb.set_trace
(venv38) myuser@explore$ echo $PYTHONBREAKPOINT
ipdb.set_trace
(venv38) myuser@explore$ PYTHONBREAKPOINT=0 pytest test_188_breakpoint.py
=================================== test session starts ====================================
platform darwin -- Python 3.8.6, pytest-5.1.2, py-1.9.0, pluggy-0.13.1
rootdir: /Users/myuser/kds2/wk/explore
plugins: celery-4.4.7, cov-2.10.0
collected 0 items
================================== no tests ran in 0.03s ===================================
(venv38) myuser@explore$ echo $PYTHONBREAKPOINT
ipdb.set_trace

ps.

Ik gebruik bashonder macos, elke posix-shell zal zich in wezen hetzelfde gedragen. Windows, powershell of DOS, kan verschillende mogelijkheden hebben, vooral rond PYTHONBREAKPOINT=<some value> <some command>om een omgevingsvariabele voor slechts één commando in te stellen.


Antwoord 15

Als je een IDE wilt gebruiken, is er één goed alternatief voor PyCharm: VScode

  1. Installeer VScode
  2. Python-extensie toevoegen, als deze nog niet bestaat
  3. Maak een bestand mymodule.pymet Python-code
  4. Klik op een regelnummer bij mymodule.pyom een breekpunt in te stellen
  5. Druk op F5en selecteer Debug Python file

Het stopt bij het breekpunt en je kunt je gebruikelijke foutopsporingsdingen doen, zoals het inspecteren van de waarden van variabelen, ofwel op het tabblad VARIABLES(meestal aan de linkerkant) of door te klikken op Debug Console(meestal onderaan naast je Terminal):

Other episodes