Apa tips terbaik Anda untuk debugging Python?
Tolong jangan hanya daftar debugger tertentu tanpa mengatakan apa yang sebenarnya bisa dilakukan.
Terkait
- Apa cara yang baik untuk membuat kode Python saya berjalan pertama kali? - Ini membahas meminimalkan kesalahan
Jawaban:
PDB
Anda dapat menggunakan modul pdb, masukkan di
pdb.set_trace()
mana saja dan itu akan berfungsi sebagai breakpoint.Untuk melanjutkan penggunaan eksekusi
c
(ataucont
ataucontinue
).Dimungkinkan untuk mengeksekusi ekspresi Python sewenang-wenang menggunakan pdb. Misalnya, jika Anda menemukan kesalahan, Anda dapat memperbaiki kode, lalu ketikkan ekspresi tipe untuk memiliki efek yang sama dalam kode yang sedang berjalan
ipdb adalah versi pdb untuk IPython . Ini memungkinkan penggunaan pdb dengan semua fitur IPython termasuk penyelesaian tab.
Dimungkinkan juga untuk mengatur pdb agar berjalan secara otomatis pada pengecualian yang tidak tertangkap.
Pydb ditulis untuk menjadi versi Pdb yang disempurnakan. Manfaat?
sumber
myserver.com/pdb
dalam mode debug yang cukupimport pdb; pdb.set_trace()
. Jika Anda menggunakan Flask / Werkzeug yang memiliki debugger interaktif, Anda juga dapat memiliki pandangan yang baru saja melakukannyaassert False
.http://pypi.python.org/pypi/pudb , layar penuh, debugger Python berbasis konsol.
Bagus untuk debugging skrip mandiri, jalankan saja
sumber
pip install pudb
Jika Anda menggunakan pdb, Anda dapat menentukan alias untuk pintasan. Saya menggunakan ini:
sumber
Penebangan
Python sudah memiliki modul logging bawaan yang luar biasa . Anda mungkin ingin menggunakan templat pendataan di sini .
Modul logging memungkinkan Anda menentukan tingkat kepentingan; selama debugging Anda dapat mencatat semuanya, sementara selama operasi normal Anda mungkin hanya mencatat hal-hal penting. Anda dapat mematikan dan menghidupkan berbagai hal.
Kebanyakan orang hanya menggunakan pernyataan cetak dasar untuk debug, dan kemudian menghapus pernyataan cetak. Lebih baik meninggalkannya, tetapi nonaktifkan; kemudian, ketika Anda memiliki bug lain, Anda bisa mengaktifkan kembali semuanya dan melihat log Anda.
Ini bisa menjadi cara terbaik untuk men-debug program yang perlu melakukan sesuatu dengan cepat, seperti program jaringan yang perlu merespons sebelum ujung koneksi jaringan yang lain mati dan hilang. Anda mungkin tidak punya banyak waktu untuk satu langkah debugger; tetapi Anda bisa membiarkan kode Anda berjalan, dan mencatat semuanya, lalu memeriksa log dan mencari tahu apa yang sebenarnya terjadi.
EDIT: URL asli untuk templat adalah: http://aymanh.com/python-debugging-techniques
Halaman ini tidak ada sehingga saya menggantinya dengan referensi ke snapshot yang disimpan di archive.org: http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-techniques
Jika hilang lagi, berikut adalah templat yang saya sebutkan. Ini kode yang diambil dari blog; Saya tidak menulisnya.
Dan inilah penjelasannya tentang cara menggunakan hal di atas. Sekali lagi, saya tidak mendapatkan kredit untuk ini:
Secara default, modul logging mencetak pesan kritis, kesalahan, dan peringatan. Untuk mengubah ini sehingga semua level dicetak, gunakan:
Untuk mengirim pesan log ke file bernama debug.log, gunakan:
sumber
Dimungkinkan untuk mencetak garis Python apa yang dieksekusi (terima kasih Geo!). Ini memiliki sejumlah aplikasi, misalnya, Anda dapat memodifikasinya untuk memeriksa kapan fungsi tertentu dipanggil atau menambahkan sesuatu seperti ## membuatnya hanya melacak baris tertentu.
code.interact membawa Anda ke konsol interaktif
Jika Anda ingin dapat dengan mudah mengakses riwayat konsol Anda lihat: " Dapatkah saya memiliki mekanisme riwayat seperti di shell? " ( Harus melihat ke bawah untuk itu).
Pengisian otomatis dapat diaktifkan untuk penerjemah .
sumber
ipdb seperti pdb, dengan kehebatan ipython.
sumber
print
pernyataandebug_print
fungsi alih-alih mencetak agar mudah dinonaktifkanpprint
modul sangat berharga untuk struktur yang komplekssumber
cara yang jelas untuk men-debug skrip
jika Anda tidak tahu persis di mana skrip itu berada
sumber
PyDev
PyDev memiliki debugger interaktif yang cukup bagus. Ini memiliki ekspresi tontonan, arahkan untuk mengevaluasi, utas dan susun daftar dan (hampir) semua fasilitas yang biasa Anda harapkan dari debugger visual modern. Anda bahkan dapat melampirkan ke proses yang sedang berjalan dan melakukan debugging jarak jauh.
Namun, seperti para pengalih perhatian visual lainnya, saya merasakan manfaatnya terutama untuk masalah sederhana, atau untuk masalah yang sangat rumit setelah saya mencoba yang lain. Saya masih melakukan sebagian besar pengangkatan dengan logging.
sumber
Jika Anda terbiasa dengan Visual Studio, Python Tools untuk Visual Studio adalah yang Anda cari.
sumber
Winpdb sangat bagus, dan bertentangan dengan namanya itu sepenuhnya lintas platform.
Ia memiliki debugger berbasis GUI dan prompt yang sangat bagus , dan mendukung debugging jarak jauh.
sumber
Di Vim, saya punya tiga ikatan ini:
rpdb2
adalah Remote Python Debugger, yang dapat digunakan dengan WinPDB, debugger grafis yang solid. Karena saya tahu Anda akan bertanya, itu dapat melakukan semua yang saya harapkan dilakukan oleh debugger grafis :)Saya menggunakan
pdb
darinose.tools
sehingga saya bisa men-debug unit test serta kode normal.Akhirnya,
F7
pemetaan akan mencetak traceback (mirip dengan jenis yang Anda dapatkan ketika pengecualian muncul di bagian atas tumpukan). Saya merasa ini sangat berguna lebih dari beberapa kali.sumber
Mendefinisikan metode repr () yang berguna untuk kelas Anda (sehingga Anda dapat melihat apa objek itu) dan menggunakan repr () atau "% r"% (...) atau "... {0! R} ..". (...) di pesan / log debug Anda adalah IMHO kunci untuk debugging yang efisien.
Selain itu, para penentang yang disebutkan dalam jawaban lain akan menggunakan metode repr ().
sumber
Mendapatkan jejak tumpukan dari aplikasi Python yang sedang berjalan
Ada beberapa trik di sini . Ini termasuk
sumber
Jika Anda tidak suka menghabiskan waktu di debugger (dan tidak menghargai kegunaan
pdb
antarmuka baris perintah yang buruk ), Anda dapat membuang jejak eksekusi dan menganalisisnya nanti. Sebagai contoh:Ini akan membuang semua baris sumber
setup.py install
eksekusi keexecution.log
.Untuk membuatnya lebih mudah untuk menyesuaikan keluaran jejak dan menulis pelacak Anda sendiri, saya mengumpulkan beberapa potongan kode ke modul xtrace (domain publik).
sumber
Jika memungkinkan, saya men-debug menggunakan
M-x pdb
emacs untuk debugging tingkat sumber.sumber
Ada kursus online lengkap yang disebut " Software Debugging " oleh Andreas Zeller di Udacity, dikemas dengan tips tentang debugging:
Sangat dianjurkan.
sumber
jika Anda ingin cara grafis yang bagus untuk mencetak tumpukan panggilan Anda dengan cara yang dapat dibaca, lihat utilitas ini: https://github.com/joerick/pyinstrument
Jalankan dari baris perintah:
Jalankan sebagai modul:
Jalankan dengan Django:
Cukup tambahkan
pyinstrument.middleware.ProfilerMiddleware
keMIDDLEWARE_CLASSES
, kemudian menambahkan?profile
ke akhir URL permintaan untuk mengaktifkan profiler.sumber