Cómo Depurar Un Programa Python Con Pdb _ Pybonacci

9
18-1-2015 Cómo depurar un programa Python con pdb | Pybonacci https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/ 1/9 Pybonacci Computación Científica con Python en castellano Cómo depurar un programa Python con pdb Introducción En este artículo vamos a explicar cómo depurar un programa Python usando el módulo pdb de la biblioteca estándar. Si no sabes qué es exactamente depurar un programa o para qué te puede servir, sigue leyendo. Depurar consiste en seguir el flujo de un programa a medida que se ejecuta, de forma que podemos monitorizar qué es lo que está sucediendo en cada momento. Es un método muy efectivo para encontrar fallos, porque: Permite detener momentáneamente la ejecución del programa usando puntos de ruptura (breakpoints). Permite examinar en cada momento las variables que se están utilizando (no necesitas llenar tu código de print). Permite cambiar el valor de una variable mientras está detenida la ejecución. Si es la primera vez que oyes hablar de esto, en seguida descubrirás el mundo de posibilidades que ofrece la depuración. Puedes leer online la documentación del módulo pdb . En esta entrada se ha usado python 3.3.2. Primeros pasos Vamos a utilizar este programa extraído del libro «Dive into Python 3»:

description

programación

Transcript of Cómo Depurar Un Programa Python Con Pdb _ Pybonacci

  • 18-1-2015 Cmo depurar un programa Python con pdb | Pybonacci

    https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/ 1/9

    Pybonacci

    ComputacinCientficaconPythonencastellano

    CmodepurarunprogramaPythonconpdb

    Introduccin

    EnesteartculovamosaexplicarcmodepurarunprogramaPythonusandoelmdulopdbdelabibliotecaestndar.Sinosabesquesexactamentedepurarunprogramaoparaqutepuedeservir,sigueleyendo.

    Depurarconsisteenseguirelflujodeunprogramaamedidaqueseejecuta,deformaquepodemosmonitorizarquesloqueestsucediendoencadamomento.Esunmtodomuyefectivoparaencontrarfallos,porque:

    Permitedetenermomentneamentelaejecucindelprogramausandopuntosderuptura(breakpoints).Permiteexaminarencadamomentolasvariablesqueseestnutilizando(nonecesitasllenartucdigodeprint).Permitecambiarelvalordeunavariablemientrasestdetenidalaejecucin.

    Sieslaprimeravezqueoyeshablardeesto,enseguidadescubrirselmundodeposibilidadesqueofreceladepuracin.

    Puedesleeronlineladocumentacindelmdulopdb.

    Enestaentradasehausadopython3.3.2.

    Primerospasos

    VamosautilizaresteprogramaextradodellibroDiveintoPython3:

    https://pybonacci.wordpress.com/http://docs.python.org/3.3/library/pdb.html

  • 18-1-2015 Cmo depurar un programa Python con pdb | Pybonacci

    https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/ 2/9

    Quesimplementeproducelasiguientesalida:

    Laformamsdirectadeiniciareldepuradoresconlalnea:

    Deacuerdo,quacabadesuceder?Nosencontramosconunintrpreteinteractivoesperandordenes,ylalneaqueempiezapor->eslalneadondeseencuentradetenidalaejecucinahoramismo.

    LoprimeroqueobservamosesquepodemosejecutarcualquierinstruccinPythonquequeramos:

    123456789

    10111213141516171819202122232425262728

    SUFFIXES={1000:['KB','MB','GB','TB','PB','EB','ZB','YB'1024:['KiB','MiB','GiB','TiB','PiB','EiB','ZiB'defapproximate_size(size,a_kilobyte_is_1024_bytes=True):'''Convertafilesizetohumanreadableform.Keywordarguments:sizefilesizeinbytesa_kilobyte_is_1024_bytesifTrue(default),usemultiplesof1024ifFalse,usemultiplesof1000Returns:string'''ifsizeSUFFIXES={1000:['KB','MB','GB','TB','PB','EB','ZB','YB'],(Pdb)

    12345

    (Pdb)2*816(Pdb)"Hello".lower()'hello'(Pdb)importnumpyasnpnp.sqrt(2)

  • 18-1-2015 Cmo depurar un programa Python con pdb | Pybonacci

    https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/ 3/9

    Paramostrarunalistadecomandosdisponibles,escribimoshelp.Tambinpodemosmostrarlaayudadecadacomandoindividial:

    Comosepuedeleer,podemosusarelcomandolistparaexaminarelcdigofuentedelarchivoqueestamosejecutando.Laprimeravezqueloejecutemossinargumentosmostrarlas11primeraslneasymarcarcon->lalneaactual,ysiseguimosejecutndoloproseguiravanzando.Veamos:

    6 1.4142135623730951

    123456789

    101112131415161718192021222324252627282930313233

    (Pdb)helpDocumentedcommands(typehelp):========================================EOFcldisableinteractnextreturnuwhereacleardisplayjpretvalunaliasaliascommandsdownjumppprunundisplayargsconditionenablelprintrvuntbcontexitlistqsuntilbreakcontinuehllquitsourceupbtdhelplonglistrstepwcdebugignorenrestarttbreakwhatisMiscellaneoushelptopics:==========================execpdb(Pdb)helplistl(ist)[first[,last]|.]Listsourcecodeforthecurrentfile.Withoutarguments,list11linesaroundthecurrentlineorcontinuethepreviouslisting.With.asargument,list11linesaroundthecurrentline.Withoneargument,list11linesstartingatthatline.Withtwoarguments,listthegivenrangeifthesecondargumentislessthanthefirst,itisacount.Thecurrentlineinthecurrentframeisindicatedby">".Ifanexceptionisbeingdebugged,thelinewheretheexceptionwasoriginallyraisedorpropagatedisindicatedby">>",ifitdiffersfromthecurrentline.(Pdb)

    123456789

    (Pdb)list1>SUFFIXES={1000:['KB','MB','GB','TB','PB','EB','ZB','YB'],21024:['KiB','MiB','GiB','TiB','PiB','EiB','ZiB',3'YiB']}45defapproximate_size(size,a_kilobyte_is_1024_bytes=True):6'''Convertafilesizetohumanreadableform.78Keywordarguments:

  • 18-1-2015 Cmo depurar un programa Python con pdb | Pybonacci

    https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/ 4/9

    Ahora,unpardetrucos:

    Hasvistoque,almostrarlalistadecomandos,habamuchosconunasolaletra?Loquesucedeesquesonatajos:porejemplo,lesunatajoparalist,asquenotienesqueescribirelcomandoentero.Pararepetirelltimocomandointroducido,simplementepresionaEnter.Siquieresrepetirelcomandolisttresveces,introducelunavezyEnterotrasdos.Msfcilimposible

    Porejemplo,paramostrardndeestamosdetenidospodemosusarelcomandowhereosimplementew:

    Siqueremoscerrareldepuradorusaramosquit,ysiqueremosqueelprogramacontinuehastaelfinal,usaremoscontinueoc:

    Elprogramatermina,sereiniciayestamosenelmismopuntoqueantes.Demomentonohemoshechonadademasiadointeresante:comencemos

    101112131415161718192021222324

    9sizefilesizeinbytes10a_kilobyte_is_1024_bytesifTrue(default),usemultiplesof102411ifFalse,usemultiplesof1000(Pdb)list1213Returns:string1415'''16ifsize/home/juanlu/Development/Python/test/pdb/example.py(1)()>SUFFIXES={1000:['KB','MB','GB','TB','PB','EB','ZB','YB'],

    1234567

    (Pdb)c1.0TB931.3GiBTheprogramfinishedandwillberestarted>/home/juanlu/Development/Python/test/pdb/example.py(1)()>SUFFIXES={1000:['KB','MB','GB','TB','PB','EB','ZB','YB'],(Pdb)

  • 18-1-2015 Cmo depurar un programa Python con pdb | Pybonacci

    https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/ 5/9

    Flujoeinspeccindevariables

    Ahora,cmoconseguimosiravanzandoenelflujodeejecucin?Paraellotenemosdoscomandos:step(s)ynext(n).Ambosejecutanunalneadelprogramayavanzanalasiguiente,conladiferenciadequestepseintroducedentrodelasfuncionescuandoseinvocaalguna.Volviendoanuestroejemplo:

    Hemosidoejecutandolaslneasunaauna,yalllegaralalneaprintyusarnextsehaejecutadotambinyhasaltadoalasiguiente.Siparalasiguientelneaprintusamosstep,nosintroduciremosenelcuerpodelafuncinapproximate_sizeyseguiremosdepurandodesdeah:

    123456789

    10111213141516171819202122

    Theprogramfinishedandwillberestarted>/home/juanlu/Development/Python/test/pdb/example.py(1)()>SUFFIXES={1000:['KB','MB','GB','TB','PB','EB','ZB','YB'],(Pdb)n>/home/juanlu/Development/Python/test/pdb/example.py(2)()>1024:['KiB','MiB','GiB','TiB','PiB','EiB','ZiB',(Pdb)#PresionamosEnter,lomismoqueejecutarnextotravez>/home/juanlu/Development/Python/test/pdb/example.py(3)()(Pdb)>/home/juanlu/Development/Python/test/pdb/example.py(5)()>defapproximate_size(size,a_kilobyte_is_1024_bytes=True):(Pdb)>/home/juanlu/Development/Python/test/pdb/example.py(27)()>if__name__=='__main__':(Pdb)>/home/juanlu/Development/Python/test/pdb/example.py(28)()>print(approximate_size(1000000000000,False))(Pdb)#nextejecutalalneaperonoseintroduceenapproximate_size1.0TB>/home/juanlu/Development/Python/test/pdb/example.py(29)()>print(approximate_size(1000000000000))(Pdb)

    123456789

    1011121314

    >/home/juanlu/Development/Python/test/pdb/example.py(29)()>print(approximate_size(1000000000000))(Pdb)sCall>/home/juanlu/Development/Python/test/pdb/example.py(5)approximate_size()>defapproximate_size(size,a_kilobyte_is_1024_bytes=True):(Pdb)>/home/juanlu/Development/Python/test/pdb/example.py(16)approximate_size()>ifsize

  • 18-1-2015 Cmo depurar un programa Python con pdb | Pybonacci

    https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/ 6/9

    Estamosahoraenesalneaynosabemosloquevaasuceder.Cmoaveriguamoselvalordeunavariable?Usandoelcomandoprint(p):

    Ysiahoranosapetecesalirdelcuerpodelafuncinyvolveralprogramaprincipal,escribimosreturn(r):

    Puntosderuptura

    Imaginaquetienesunprogramamuylargoynoquieresirlneaporlneadesdeelprincipiohastaelpuntoqueteinteresa.Paraesoexistenlospuntosderuptura:siestablecesunpuntoderupturaenunalnea,elcomandocontinueejecutarelprogramasindepuracinhastaqueencuentreuno,yentoncessedetendr.Sivuelvesausarcontinueeldepuradorsevolveradetenerenelsiguientepuntoderuptura,yassucesivamentehastaqueyanoquedenyelprogramafinalice,comovimosalprincipiodelartculo.

    Paraestablecerunpuntoderupturaseutilizaelcomandobreak(b):

    1516171819202122

    15'''16>ifsize/home/juanlu/Development/Python/test/pdb/example.py(23)approximate_size()>'931.3GiB'>return'{0:.1f}{1}'.format(size,suffix)(Pdb)931.3GiBReturn>/home/juanlu/Development/Python/test/pdb/example.py(29)()>None>print(approximate_size(1000000000000))(Pdb)

    12345

    $pythonmpdbexample.py>/home/juanlu/Development/Python/test/pdb/example.py(1)()>SUFFIXES={1000:['KB','MB','GB','TB','PB','EB','ZB','YB'],(Pdb)l1>SUFFIXES={1000:['KB','MB','GB','TB','PB','EB','ZB','YB'],

  • 18-1-2015 Cmo depurar un programa Python con pdb | Pybonacci

    https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/ 7/9

    Hemosestablecidounpuntoderupturaenlalnea21delprograma,yacontinuacineldepuradorlohaejecutadohastallegaradichalnea.Yapartirdeahtodofuncionaigualqueantes

    Otraformadeestablecerunpuntoderupturaentuprogramaesincluirlasiguientelnea:

    Deestemodo,alejecutarlosaltareldepuradordirectamente:

    Tehaayudadoestoaencontrareseerrorqueseteresista?Cuntanosenloscomentarios

    Unsaludo!

    6789

    101112131415161718192021222324252627282930313233

    21024:['KiB','MiB','GiB','TiB','PiB','EiB','ZiB',3'YiB']}45defapproximate_size(size,a_kilobyte_is_1024_bytes=True):6'''Convertafilesizetohumanreadableform.78Keywordarguments:9sizefilesizeinbytes10a_kilobyte_is_1024_bytesifTrue(default),usemultiplesof102411ifFalse,usemultiplesof1000(Pdb)1213Returns:string1415'''16ifsizesize/=multiple(Pdb)

    12345

    multiple=1024ifa_kilobyte_is_1024_byteselse1000forsuffixinSUFFIXES[multiple]:importpdbpdb.set_trace()size/=multipleifsize/home/juanlu/Development/Python/test/pdb/example.py(22)approximate_size()>size/=multiple(Pdb)

  • 18-1-2015 Cmo depurar un programa Python con pdb | Pybonacci

    https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/ 8/9

    WrittenbyJuanlu001

    14dejuniode2013at14:51

    PublicadoenTutoriales

    Taggedwithbugs,depuracin,pdb,python

    6comentarios

    SubscribetocommentswithRSS.

    Muybuenarticulo!muycompleto..muchosIDEtraenunaliasparacuandoescribesdebugteagreguelalineadepdbenvim(mieditor)yolabindeeasienel.vimrc:

    auFileTypepythoniabdebugimportpdbpdb.set_trace()

    angvp

    14dejuniode2013at15:12

    Graciasangvp!Ygraciasporeltrucodevim,seguroqueaalgunosdenuestroslectoreslesvienebienUnsaludo!

    Juanlu001

    14dejuniode2013at16:16

    ReblogueestoenElBlogdeFoxCarlosycomentado:Yaleechabademenosaundepuradordecodigo#pythonqueporcuestionesdetiemponohabiatenidotiempomdebuscaruno,puesaquilagentede#pybonacciescribiesteesxcelentepostsobre#depuraciondecodigoconPDB

    foxcarlos

    14dejuniode2013at15:29

    Graciasporelreblogging!

    Juanlu001

    14dejuniode2013at16:17

    Muchasgraciasporelartculo,mesirveparaempezarausarherramientasmaspoderosasqueunmontndeprints seagradeceeltiempoenescribirartculostantiles!

    https://pybonacci.wordpress.com/category/tutoriales/https://pybonacci.wordpress.com/tag/bugs/https://pybonacci.wordpress.com/tag/depuracion/https://pybonacci.wordpress.com/tag/pdb/https://pybonacci.wordpress.com/tag/python/https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/feed/http://gravatar.com/angvphttp://twitter.com/Juanlu001http://foxcarlos.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/http://www.foxcarlos.wordpress.com/http://twitter.com/Juanlu001

  • 18-1-2015 Cmo depurar un programa Python con pdb | Pybonacci

    https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/ 9/9

    Schcriher

    14dejuniode2013at23:46

    Graciasatiporelcomentario!Sindudaladepuracinesunapoderosaherramienta Sitienesdudasyasabesdndeencontrarnos!

    Juanlu001

    15dejuniode2013at10:31

    Loscomentariosestncerrados.

    CreaunblogounsitiowebgratuitosconWordPress.com.EltemaJournalistv1.9.

    Seguir

    SeguirPybonacci

    ConstruyeunsitiowebconWordPress.com

    http://www.schcriher.com.ar/http://twitter.com/Juanlu001https://es.wordpress.com/?ref=footer_websitehttps://wordpress.com/themes/journalist/javascript:void(0)https://es.wordpress.com/?ref=lof