Sunteți pe pagina 1din 9

18-1-2015

Cmo depurar un programa Python con pdb | Pybonacci

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

Cmo depurar un programa Python con pdb | Pybonacci

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

Cmo depurar un programa Python con pdb | Pybonacci

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

Cmo depurar un programa Python con pdb | Pybonacci

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

Cmo depurar un programa Python con pdb | Pybonacci

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

Cmo depurar un programa Python con pdb | Pybonacci

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

Cmo depurar un programa Python con pdb | Pybonacci

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

Cmo depurar un programa Python con pdb | Pybonacci

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

Cmo depurar un programa Python con pdb | Pybonacci

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

S-ar putea să vă placă și