Ini adalah pertanyaan yang telah saya tanyakan selama beberapa waktu, namun saya belum pernah menemukan solusi yang cocok. Jika saya menjalankan skrip dan menemukan, katakanlah IndexError, python mencetak garis, lokasi, dan deskripsi cepat tentang kesalahan dan keluar. Apakah mungkin untuk memulai pdb secara otomatis ketika kesalahan terjadi? Saya tidak menentang memiliki pernyataan impor tambahan di bagian atas file, atau beberapa baris kode tambahan.
216
Jawaban:
Anda dapat menggunakan traceback.print_exc untuk mencetak pengecualian traceback. Kemudian gunakan sys.exc_info untuk mengekstrak traceback dan akhirnya memanggil pdb.post_mortem dengan traceback itu
Jika Anda ingin memulai baris perintah interaktif dengan code.interact menggunakan penduduk lokal dari frame di mana pengecualian berasal Anda bisa melakukannya
sumber
code
lebihpdb
karena yang terakhir tampaknya memperluas mantan?code
?sys.exc_info
untuk mengekstrak traceback dan akhirnya memanggilpdb.post_mortem
dengan traceback itu . Anda tidak perlu meneruskan objek traceback kepdb.post_mortem
. Dari dokumen : Jika tidak ada traceback yang diberikan, ia menggunakan salah satu pengecualian yang sedang ditangani (pengecualian harus ditangani jika default akan digunakan).Jika Anda tidak memberikan
-c continue
tanda maka Anda harus memasukkan 'c' (untuk Lanjutkan) saat eksekusi dimulai. Kemudian akan berjalan ke titik kesalahan dan memberi Anda kontrol di sana. Seperti yang disebutkan oleh eqzx , flag ini adalah tambahan baru di python 3.2 sehingga memasukkan 'c' diperlukan untuk versi Python sebelumnya (lihat https://docs.python.org/3/library/pdb.html ).sumber
gdb
; dan ketika Anda memasukkan 'r'pdb
, program memang berjalan, tetapi TIDAK berhenti (atau menghasilkan backtrace) pada kesalahan; membuat saya bingung sampai saya membaca ini. Bersulang!ipdb
; dan tentu saja argumen dapat ditambahkan setelah skrip!Gunakan modul berikut:
Beri nama
debug
(atau apa pun yang Anda suka) dan letakkan di suatu tempat di jalur python Anda.Sekarang, di awal skrip Anda, tambahkan saja
import debug
.sumber
try-catch
yang hanya IMO jelek.pudb
lebihpdb
. Terus kembali ke copy-and-paste, yang pasti mengatakan sesuatu tentang kurangnya ketertiban dalam hidup saya.Ipython memiliki perintah untuk mengubah perilaku ini: % pdb . Itu tidak persis seperti yang Anda jelaskan, bahkan mungkin sedikit lebih (memberi Anda backtraces lebih informatif dengan penyorotan sintaksis dan penyelesaian kode). Pasti patut dicoba!
sumber
%debug
memungkinkan seseorang untuk membuka debugger setelah menemukan kesalahan. Saya sering lebih suka ini%pdb
. (Trade-off hanya mengetikq
setiap kali Anda tidak ingin debug kesalahan vs mengetik%debug
setiap kali Anda melakukan ingin debug kesalahan.)c.InteractiveShell.pdb = True
padaipython_config.py
giliran seseorang dihidupkan%pdb
secara otomatis untuk setiap sesi.Ini bukan debugger, tapi mungkin sama bermanfaatnya (?)
Saya tahu saya mendengar Guido menyebutkan ini dalam suatu pidato di suatu tempat.
Saya baru saja memeriksa python - ?, dan jika Anda menggunakan perintah -i Anda dapat berinteraksi di mana skrip Anda berhenti.
Jadi diberikan skrip ini:
Anda bisa mendapatkan hasil ini!
Sejujurnya saya belum pernah menggunakan ini, tetapi saya harus, tampaknya sangat berguna.
sumber
IPython membuatnya mudah di baris perintah:
dapat ditulis ulang menjadi
Atau, sama halnya, jika memanggil modul:
dapat ditulis ulang menjadi
Perhatikan
--
untuk menghentikan IPython dari membaca argumen skrip sebagai miliknya.Ini juga memiliki keuntungan menggunakan debugger IPython yang ditingkatkan (ipdb) daripada pdb.
sumber
Jika Anda menggunakan
ipython
, setelah meluncurkan jenis%pdb
sumber
Jika Anda menggunakan lingkungan IPython, Anda bisa menggunakan% debug dan shell akan membawa Anda kembali ke garis yang menyinggung dengan lingkungan ipdb untuk inspeksi dll. Opsi lain seperti yang ditunjukkan di atas adalah menggunakan sihir iPython% pdb yang secara efektif tidak sama.
sumber
up
dandown
perintah untuk kembali ke baris kode Anda yang menghasilkan kesalahan.Anda dapat meletakkan baris ini dalam kode Anda:
Info lebih lanjut: Mulai python debugger di baris mana pun
sumber
Untuk menjalankannya tanpa harus mengetikkan c di awal gunakan:
Pdb memiliki argumen baris perintahnya sendiri: -cc akan mengeksekusi perintah c (ontinue) pada awal eksekusi dan program akan berjalan tanpa gangguan sampai kesalahan.
sumber
python -m pdb script.py di python2.7 tekan terus untuk memulai dan itu akan berjalan ke kesalahan dan istirahat di sana untuk debug.
sumber
Jika Anda menjalankan modul:
Dan sekarang Anda ingin memasukkan
pdb
ketika pengecualian terjadi, lakukan ini:(atau perpanjang Anda
PYTHONPATH
). ThePYTHONPATH
diperlukan agar modul ditemukan di jalan, karena Anda menjalankanpdb
modul sekarang.sumber
Letakkan breakpoint di dalam konstruktor kelas pengecualian teratas dalam hierarki, dan sebagian besar waktu Anda akan melihat di mana kesalahan itu muncul.
Puting breakpoint berarti apa pun yang Anda inginkan: Anda dapat menggunakan IDE, atau
pdb.set_trace
, atau apa punsumber