cómo depurar un programa python con pdb _ pybonacci
DESCRIPTION
programaciónTRANSCRIPT
-
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