Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Pybonacci
ComputacinCientficaconPythonencastellano
CmodepurarunprogramaPythonconpdb
Introduccin
EnesteartculovamosaexplicarcmodepurarunprogramaPythonusandoelmdulopdbdela
bibliotecaestndar.Sinosabesquesexactamentedepurarunprogramaoparaqutepuedeservir,sigue
leyendo.
Depurarconsisteenseguirelflujodeunprogramaamedidaqueseejecuta,deformaquepodemos
monitorizarquesloqueestsucediendoencadamomento.Esunmtodomuyefectivoparaencontrarfallos,
porque:
Permitedetenermomentneamentelaejecucindelprogramausandopuntosderuptura(breakpoints).
Permiteexaminarencadamomentolasvariablesqueseestnutilizando(nonecesitasllenartucdigode
print).
Permitecambiarelvalordeunavariablemientrasestdetenidalaejecucin.
Sieslaprimeravezqueoyeshablardeesto,enseguidadescubrirselmundodeposibilidadesqueofrecela
depuracin.
Puedesleeronlineladocumentacindelmdulopdb.
Enestaentradasehausadopython3.3.2.
Primerospasos
VamosautilizaresteprogramaextradodellibroDiveintoPython3:
https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/
1/9
18-1-2015
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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:
sizefilesizeinbytes
a_kilobyte_is_1024_bytesifTrue(default),usemultiplesof
ifFalse,usemultiplesof1000
Returns:string
'''
ifsize<0:
raiseValueError('numbermustbenonnegative')
multiple=1024ifa_kilobyte_is_1024_byteselse1000
forsuffixinSUFFIXES[multiple]:
size/=multiple
ifsize<multiple:
return'{0:.1f}{1}'.format(size,suffix)
raiseValueError('numbertoolarge')
if__name__=='__main__':
print(approximate_size(1000000000000,False))
print(approximate_size(1000000000000))
Quesimplementeproducelasiguientesalida:
1
2
$pythonexample.py
1.0TB931.3GiB
Laformamsdirectadeiniciareldepuradoresconlalnea:
1
2
3
4
$pythonmpdbexample.py
>/home/juanlu/Development/Python/test/pdb/example.py(1)()
>SUFFIXES={1000:['KB','MB','GB','TB','PB','EB','ZB','YB'
(Pdb)
Deacuerdo,quacabadesuceder?Nosencontramosconunintrpreteinteractivoesperandordenes,yla
lneaqueempiezapor->eslalneadondeseencuentradetenidalaejecucinahoramismo.
LoprimeroqueobservamosesquepodemosejecutarcualquierinstruccinPythonquequeramos:
1
2
3
4
5
(Pdb)2*8
16
(Pdb)"Hello".lower()
'hello'
(Pdb)importnumpyasnpnp.sqrt(2)
https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/
2/9
18-1-2015
1.4142135623730951
Paramostrarunalistadecomandosdisponibles,escribimoshelp.Tambinpodemosmostrarlaayudade
cadacomandoindividial:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(Pdb)help
Documentedcommands(typehelp):
========================================
EOFcldisableinteractnextreturnuwh
acleardisplayjpretvalunalias
aliascommandsdownjumppprunundisplay
argsconditionenablelprintrvunt
bcontexitlistqsuntil
breakcontinuehllquitsourceup
btdhelplonglistrstepw
cdebugignorenrestarttbreakwhatis
Miscellaneoushelptopics:
==========================
execpdb
(Pdb)helplist
l(ist)[first[,last]|.]
Listsourcecodeforthecurrentfile.Withoutarguments,
list11linesaroundthecurrentlineorcontinuetheprevi
listing.With.asargument,list11linesaroundthecurr
line.Withoneargument,list11linesstartingatthatli
Withtwoarguments,listthegivenrangeifthesecond
argumentislessthanthefirst,itisacount.
Thecurrentlineinthecurrentframeisindicatedby">".
Ifanexceptionisbeingdebugged,thelinewherethe
exceptionwasoriginallyraisedorpropagatedisindicated
">>",ifitdiffersfromthecurrentline.
(Pdb)
Comosepuedeleer,podemosusarelcomandolistparaexaminarelcdigofuentedelarchivoque
estamosejecutando.Laprimeravezqueloejecutemossinargumentosmostrarlas11primeraslneasy
marcarcon->lalneaactual,ysiseguimosejecutndoloproseguiravanzando.Veamos:
1
2
3
4
5
6
7
8
9
(Pdb)list
1>SUFFIXES={1000:['KB','MB','GB','TB','PB','EB','ZB
21024:['KiB','MiB','GiB','TiB','PiB','EiB'
3'YiB']}
4
5defapproximate_size(size,a_kilobyte_is_1024_bytes=True):
6'''Convertafilesizetohumanreadableform.
7
8Keywordarguments:
https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/
3/9
18-1-2015
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
9sizefilesizeinbytes
10a_kilobyte_is_1024_bytesifTrue(default),usemult
11ifFalse,usemultiplesof
(Pdb)list
12
13Returns:string
14
15'''
16ifsize<0:
17raiseValueError('numbermustbenonnegative')
18
19multiple=1024ifa_kilobyte_is_1024_byteselse1000
20forsuffixinSUFFIXES[multiple]:
21size/=multiple
22ifsize<multiple:
Ahora,unpardetrucos:
Hasvistoque,almostrarlalistadecomandos,habamuchosconunasolaletra?Loquesucedeesque
sonatajos:porejemplo,lesunatajoparalist,asquenotienesqueescribirelcomandoentero.
Pararepetirelltimocomandointroducido,simplementepresionaEnter.Siquieresrepetirelcomandolist
tresveces,introducelunavezyEnterotrasdos.Msfcilimposible
Porejemplo,paramostrardndeestamosdetenidospodemosusarelcomandowhereosimplementew:
1
2
3
4
5
6
(Pdb)w
/usr/lib/python3.3/bdb.py(405)run()
>exec(cmd,globals,locals)
(1)()
>/home/juanlu/Development/Python/test/pdb/example.py(1)()
>SUFFIXES={1000:['KB','MB','GB','TB','PB','EB','ZB','YB'
Siqueremoscerrareldepuradorusaramosquit,ysiqueremosqueelprogramacontinuehastaelfinal,
usaremoscontinueoc:
1
2
3
4
5
6
7
(Pdb)c
1.0TB
931.3GiB
Theprogramfinishedandwillberestarted
>/home/juanlu/Development/Python/test/pdb/example.py(1)()
>SUFFIXES={1000:['KB','MB','GB','TB','PB','EB','ZB','YB'
(Pdb)
Elprogramatermina,sereiniciayestamosenelmismopuntoqueantes.Demomentonohemoshechonada
demasiadointeresante:comencemos
https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/
4/9
18-1-2015
Flujoeinspeccindevariables
Ahora,cmoconseguimosiravanzandoenelflujodeejecucin?Paraellotenemosdoscomandos:step
(s)ynext(n).Ambosejecutanunalneadelprogramayavanzanalasiguiente,conladiferenciadeque
stepseintroducedentrodelasfuncionescuandoseinvocaalguna.Volviendoanuestroejemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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)<module>()
>1024:['KiB','MiB','GiB','TiB','PiB','EiB','ZiB',
(Pdb)#PresionamosEnter,lomismoqueejecutarnextotravez
>/home/juanlu/Development/Python/test/pdb/example.py(3)<module>()
(Pdb)
>/home/juanlu/Development/Python/test/pdb/example.py(5)<module>()
>defapproximate_size(size,a_kilobyte_is_1024_bytes=True):
(Pdb)
>/home/juanlu/Development/Python/test/pdb/example.py(27)<module>()
>if__name__=='__main__':
(Pdb)
>/home/juanlu/Development/Python/test/pdb/example.py(28)<module>()
>print(approximate_size(1000000000000,False))
(Pdb)#nextejecutalalneaperonoseintroduceenapproximate_s
1.0TB
>/home/juanlu/Development/Python/test/pdb/example.py(29)<module>()
>print(approximate_size(1000000000000))
(Pdb)
Hemosidoejecutandolaslneasunaauna,yalllegaralalneaprintyusarnextsehaejecutadotambin
yhasaltadoalasiguiente.Siparalasiguientelneaprintusamosstep,nosintroduciremosenelcuerpo
delafuncinapproximate_sizeyseguiremosdepurandodesdeah:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>/home/juanlu/Development/Python/test/pdb/example.py(29)<module>()
>print(approximate_size(1000000000000))
(Pdb)s
Call
>/home/juanlu/Development/Python/test/pdb/example.py(5)approximate
>defapproximate_size(size,a_kilobyte_is_1024_bytes=True):
(Pdb)
>/home/juanlu/Development/Python/test/pdb/example.py(16)approximat
>ifsize<0:
(Pdb)l.#Paraverdndeestamos
11ifFalse,usemultiplesof
12
13Returns:string
14
https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/
5/9
18-1-2015
15
16
17
18
19
20
21
22
15'''
16>ifsize<0:
17raiseValueError('numbermustbenonnegative')
18
19multiple=1024ifa_kilobyte_is_1024_byteselse1000
20forsuffixinSUFFIXES[multiple]:
21size/=multiple
(Pdb)
Estamosahoraenesalneaynosabemosloquevaasuceder.Cmoaveriguamoselvalordeunavariable?
Usandoelcomandoprint(p):
1
2
3
4
5
(Pdb)psize
1000000000000
(Pdb)pa_kilobyte_is_1024_bytes
True
(Pdb)
Ysiahoranosapetecesalirdelcuerpodelafuncinyvolveralprogramaprincipal,escribimosreturn(r):
1
2
3
4
5
6
7
8
9
10
(Pdb)r
Return
>/home/juanlu/Development/Python/test/pdb/example.py(23)approximat
>return'{0:.1f}{1}'.format(size,suffix)
(Pdb)
931.3GiB
Return
>/home/juanlu/Development/Python/test/pdb/example.py(29)<module>()
>print(approximate_size(1000000000000))
(Pdb)
Puntosderuptura
Imaginaquetienesunprogramamuylargoynoquieresirlneaporlneadesdeelprincipiohastaelpuntoque
teinteresa.Paraesoexistenlospuntosderuptura:siestablecesunpuntoderupturaenunalnea,elcomando
continueejecutarelprogramasindepuracinhastaqueencuentreuno,yentoncessedetendr.Sivuelves
ausarcontinueeldepuradorsevolveradetenerenelsiguientepuntoderuptura,yassucesivamente
hastaqueyanoquedenyelprogramafinalice,comovimosalprincipiodelartculo.
Paraestablecerunpuntoderupturaseutilizaelcomandobreak(b):
1
2
3
4
5
$pythonmpdbexample.py
>/home/juanlu/Development/Python/test/pdb/example.py(1)<module>()
>SUFFIXES={1000:['KB','MB','GB','TB','PB','EB','ZB','YB
(Pdb)l
1>SUFFIXES={1000:['KB','MB','GB','TB','PB','EB','ZB
https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/
6/9
18-1-2015
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
21024:['KiB','MiB','GiB','TiB','PiB','EiB'
3'YiB']}
4
5defapproximate_size(size,a_kilobyte_is_1024_bytes=True):
6'''Convertafilesizetohumanreadableform.
7
8Keywordarguments:
9sizefilesizeinbytes
10a_kilobyte_is_1024_bytesifTrue(default),usemult
11ifFalse,usemultiplesof
(Pdb)
12
13Returns:string
14
15'''
16ifsize<0:
17raiseValueError('numbermustbenonnegative')
18
19multiple=1024ifa_kilobyte_is_1024_byteselse1000
20forsuffixinSUFFIXES[multiple]:
21size/=multiple
22ifsize<multiple:
(Pdb)b21
Breakpoint1at/home/juanlu/Development/Python/test/pdb/example.py
(Pdb)c
>/home/juanlu/Development/Python/test/pdb/example.py(21)approximat
>size/=multiple
(Pdb)
Hemosestablecidounpuntoderupturaenlalnea21delprograma,yacontinuacineldepuradorloha
ejecutadohastallegaradichalnea.Yapartirdeahtodofuncionaigualqueantes
Otraformadeestablecerunpuntoderupturaentuprogramaesincluirlasiguientelnea:
1
2
3
4
5
multiple=1024ifa_kilobyte_is_1024_byteselse1000
forsuffixinSUFFIXES[multiple]:
importpdbpdb.set_trace()
size/=multiple
ifsize<multiple:
Deestemodo,alejecutarlosaltareldepuradordirectamente:
1
2
3
4
$pythonexample.py
>/home/juanlu/Development/Python/test/pdb/example.py(22)approximate
>size/=multiple
(Pdb)
Tehaayudadoestoaencontrareseerrorqueseteresista?Cuntanosenloscomentarios
Unsaludo!
https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/
7/9
18-1-2015
WrittenbyJuanlu001
14dejuniode2013at14:51
PublicadoenTutoriales
Taggedwithbugs,depuracin,pdb,python
6comentarios
SubscribetocommentswithRSS.
Muybuenarticulo!muycompleto..muchosIDEtraenunaliasparacuandoescribesdebugteagregue
lalineadepdbenvim(mieditor)yolabindeeasienel.vimrc:
auFileTypepythoniabdebugimportpdbpdb.set_trace()
angvp
14dejuniode2013at15:12
Graciasangvp!Ygraciasporeltrucodevim,seguroqueaalgunosdenuestroslectoreslesvienebien
Unsaludo!
Juanlu001
14dejuniode2013at16:16
ReblogueestoenElBlogdeFoxCarlosycomentado:
Yaleechabademenosaundepuradordecodigo#pythonqueporcuestionesdetiemponohabiatenido
tiempomdebuscaruno,puesaquilagentede#pybonacciescribiesteesxcelentepostsobre#depuracion
decodigoconPDB
foxcarlos
14dejuniode2013at15:29
Graciasporelreblogging!
Juanlu001
14dejuniode2013at16:17
Muchasgraciasporelartculo,mesirveparaempezarausarherramientasmaspoderosasqueunmontn
deprints seagradeceeltiempoenescribirartculostantiles!
https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/
8/9
18-1-2015
Schcriher
14dejuniode2013at23:46
Graciasatiporelcomentario!Sindudaladepuracinesunapoderosaherramienta
dudasyasabesdndeencontrarnos!
Sitienes
Juanlu001
15dejuniode2013at10:31
Loscomentariosestncerrados.
CreaunblogounsitiowebgratuitosconWordPress.com.EltemaJournalistv1.9.
Seguir
SeguirPybonacci
ConstruyeunsitiowebconWordPress.com
https://pybonacci.wordpress.com/2013/06/14/como-depurar-un-programa-python-con-pdb/
9/9