Bagaimana cara melangkah melalui kode Python untuk membantu masalah debug?

186

Di Java / C # Anda dapat dengan mudah melangkah melalui kode untuk melacak apa yang mungkin salah, dan IDE membuat proses ini sangat user friendly.

Bisakah Anda melacak melalui kode python dengan cara yang sama?

Blankman
sumber

Jawaban:

264

Iya! Ada debugger Python yang dipanggil pdbhanya untuk melakukan itu!

Anda dapat meluncurkan program Python melalui pdbdengan menggunakan pdb myscript.pyatau python -m pdb myscript.py.

Ada beberapa perintah yang bisa Anda keluarkan, yang didokumentasikan di pdb halaman.

Beberapa yang berguna untuk diingat adalah:

  • b: atur breakpoint
  • c: lanjutkan debugging hingga Anda mencapai breakpoint
  • s: melangkah melalui kode
  • n: untuk pergi ke baris kode berikutnya
  • l: daftar kode sumber untuk file saat ini (default: 11 baris termasuk baris yang sedang dieksekusi)
  • u: menavigasi bingkai tumpukan
  • d: menavigasi ke bawah bingkai tumpukan
  • p: untuk mencetak nilai ekspresi dalam konteks saat ini

Jika Anda tidak ingin menggunakan debugger baris perintah, beberapa IDE seperti Pydev , Wing IDE atau PyCharm memiliki debugger GUI. Wing dan PyCharm adalah produk komersial, tetapi Wing memiliki edisi "Pribadi" gratis, dan PyCharm memiliki edisi komunitas gratis.

mit
sumber
10
Wow, saya tidak percaya saya mengalami kesulitan menemukan pdb grafis untuk linux / ubuntu. Apakah saya melewatkan sesuatu? Saya mungkin harus melihat ke dalam membuat SublimeText Plugin untuk itu.
ThorSummoner
4
PyCharm cukup bagus sebagai debugger grafis, dan Edisi Komunitasnya gratis!
Pieter
@ Thormoner, pudbbagus untuk itu. Jugapydev
alpha_989
pdbbukan alat baris perintah. Untuk menggunakannya, gunakan python -m pdb your_script.py.
jdhao
@ jdhao Saya kira itu bukan standar, tetapi pada Ubuntu pdbperintahnya adalah bagian dari pythonpaket. Bagaimanapun, python -m <module>menjadi standar untuk hal-hal lain juga seperti pip, jadi mungkin yang terbaik untuk menggunakannya secara default.
wjandrea
55

Dengan menggunakan Python Interactive Debugger 'pdb'

Langkah pertama adalah membuat juru bahasa Python untuk masuk ke mode debugging.

A. Dari Baris Perintah

Cara paling lurus ke depan, berjalan dari baris perintah, dari juru bahasa python

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

B. Dalam Penerjemah

Sambil mengembangkan versi awal modul dan bereksperimen lebih iteratif.

$ 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. Dari Dalam Program Anda

Untuk proyek besar dan modul yang berjalan lama, dapat memulai debug dari dalam program menggunakan impor pdb dan set_trace () seperti ini:

#!/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()

Langkah demi langkah debugging untuk masuk ke lebih internal

  1. Jalankan pernyataan berikutnya ... dengan "n" (berikutnya)

  2. Mengulangi perintah debugging terakhir ... dengan ENTER

  3. Berhenti semuanya ... dengan "q" (berhenti)

  4. Mencetak nilai variabel ... dengan "p" (cetak)

    a) pa

  5. Mematikan konfirmasi (Pdb)… dengan “c” (lanjutan)

  6. Melihat di mana Anda berada ... dengan "l" (daftar)

  7. Melangkah ke subrutin ... dengan "s" (melangkah ke)

  8. Melanjutkan ... tetapi hanya sampai akhir subrutin saat ini ... dengan "r" (kembali)

  9. Tetapkan nilai baru

    a) ! b = "B"

  10. Atur breakpoint

    Sebuah) potong linenumber

    b) hancurkan functionname

    c) hancurkan nama file: linenumber

  11. Breakpoint sementara

    a) kain linen kasar

  12. Breakpoint bersyarat

    a) istirahat linenumber, kondisi

Catatan: ** Semua perintah ini harus dijalankan dari ** pdb

Untuk pengetahuan mendalam, lihat: -

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

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

akD
sumber
41

Ada modul yang disebut 'pdb' dengan python. Di bagian atas skrip python Anda, Anda lakukan

import pdb
pdb.set_trace()

dan Anda akan masuk ke mode debugging. Anda dapat menggunakan 's' untuk langkah, 'n' untuk mengikuti baris berikutnya mirip dengan apa yang akan Anda lakukan dengan debugger 'gdb'.

Senthil Kumaran
sumber
21

Mulai dengan Python 3.7, Anda bisa menggunakan breakpoint()fungsi bawaan untuk masuk ke debugger:

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

Secara default, breakpoint()akan mengimpor pdbdan menelepon pdb.set_trace(). Namun, Anda dapat mengontrol perilaku debug melalui sys.breakpointhook()dan penggunaan variabel lingkunganPYTHONBREAKPOINT .

Lihat PEP 553 untuk informasi lebih lanjut.

Eugene Yarmash
sumber
2
Ketika saya melihat breakpointsaya sangat bersemangat. Tapi kemudian saya belajar bahwa itu pada dasarnya hanya jalan pintas import pdb; pdb.set_trace()dan itu membuat saya sedih. Python devs: harap fokus pada peningkatan PDB dengan fitur GDB dasar seperti baris konteks, riwayat perintah persisten dan penyelesaian otomatis tab :-)
Ciro Santilli 法轮功 冠状 at 六四 六四 事件
11

ipdb (debugger IPython)

ipdb menambahkan fungsionalitas IPython ke pdb, menawarkan peningkatan BESAR berikut:

  • penyelesaian tab
  • tampilkan lebih banyak garis konteks
  • highlight sintaks

Sama seperti pdg, ipdb masih jauh dari sempurna dan benar-benar belum sempurna jika dibandingkan dengan GDB, tetapi ini sudah merupakan peningkatan besar dibandingkan pdb.

Penggunaannya analog dengan pdb, cukup instal dengan:

python3 -m pip install --user ipdb

dan kemudian tambahkan ke baris yang Anda ingin langkah debug:

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

Anda mungkin ingin menambahkan pintasan untuk itu dari editor Anda, misalnya untuk Vim snipmate yang saya miliki:

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

jadi saya bisa mengetik adil ipd<tab>dan itu memperluas ke breakpoint. Maka menghapusnya dengan mudah ddkarena semuanya terkandung dalam satu baris.

context=21meningkatkan jumlah baris konteks seperti yang dijelaskan di: Bagaimana saya bisa membuat ipdb menampilkan lebih banyak baris konteks saat debugging?

Atau, Anda juga dapat men-debug program dari awal dengan:

ipdb3 main.py

tetapi Anda biasanya tidak ingin melakukannya karena:

  • Anda harus melewati semua definisi fungsi dan kelas saat Python membaca baris-baris itu
  • Saya tidak tahu cara mengatur ukuran konteks di sana tanpa meretas ipdb. Tambal untuk mengizinkannya: https://github.com/gotcha/ipdb/pull/155

Atau sebagai alternatif, seperti pada pdb 3.2+, Anda dapat mengatur beberapa breakpoint dari baris perintah:

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

meskipun -c crusak karena beberapa alasan: https://github.com/gotcha/ipdb/issues/156

python -m moduledebugging telah ditanyakan di: Bagaimana cara debug modul Python dijalankan dengan python -m dari baris perintah? dan karena Python 3.7 dapat dilakukan dengan:

python -m pdb -m my_module

Fitur hilang yang serius dari pdb dan ipdb dibandingkan dengan GDB:

gangguan khusus ipdb:

Diuji di Ubuntu 16.04, ipdb == 0.11, Python 3.5.2.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
5

Ada breakpoint()metode saat ini, yang menggantikan import pdb; pdb.set_trace().

Ini juga memiliki beberapa fitur baru , seperti variabel lingkungan yang mungkin.

johnnyheineken
sumber
3

Jika Anda berasal dari latar belakang Java / C #, saya kira taruhan terbaik Anda adalah menggunakan Eclipse dengan Pydev . Ini memberi Anda IDE yang berfungsi penuh dengan debugger bawaan. Saya juga menggunakannya dengan Django.

Liorion
sumber
2

Jika Anda menginginkan IDE dengan debugger terintegrasi, coba PyScripter .

baik hati
sumber
2

Python Tutor adalah debugger satu langkah online yang ditujukan untuk pemula. Anda dapat memasukkan kode pada hasil edit halaman lalu klik "Visualisasikan Eksekusi" untuk mulai menjalankannya.

Antara lain, mendukung:

Namun itu juga tidak mendukung banyak hal , misalnya:

  • Membaca / menulis file - gunakan io.StringIOdan io.BytesIOsebagai gantinya: demo
  • Kode yang terlalu besar, berjalan terlalu lama, atau mendefinisikan terlalu banyak variabel atau objek
  • Argumen baris perintah
  • Banyak modul perpustakaan standar seperti argparse, csv, enum, html, os, struct, lemah ...
wjandrea
sumber
1

Secara pemrograman, melangkah dan menelusuri kode python juga dimungkinkan (dan mudah!). Lihatlah dokumentasi sys.settrace () untuk lebih jelasnya. Juga di sini adalah tutorial untuk memulai.

Otodidak
sumber
1

PyCharm adalah IDE untuk Python yang menyertakan debugger. Tonton video YouTube ini untuk pengantar tentang penggunaan debugger PyCharm untuk menelusuri kode.

PyCharm Tutorial - Debug kode python menggunakan PyCharm

Catatan: Ini tidak dimaksudkan sebagai dukungan atau ulasan. PyCharm adalah produk komersial yang harus dibayar, tetapi perusahaan memang memberikan lisensi gratis kepada siswa dan guru, serta versi Komunitas "ringan" yang gratis dan open-source.

Tangkapan layar

Jim
sumber