Cara yang lebih sederhana untuk menempatkan breakpoint PDB dalam kode Python?

105

Hanya pertanyaan kenyamanan. Saya telah sedikit dimanjakan dengan debugger di IDE seperti Visual Studio dan XCode. Saya merasa agak canggung harus mengetik import pdb; pdb.set_trace()untuk menetapkan breakpoint (saya lebih suka tidak mengimpor pdb di bagian atas file karena saya mungkin lupa dan membiarkannya masuk).

Apakah ada cara yang lebih sederhana untuk menyetel breakpoint dalam kode Python, sesederhana dan sesederhana apa yang Anda lihat di IDE?

Joe
sumber
Gunakan PyCharm. Bagaimana bisa lebih sederhana daripada memasukkan baris breakpoint, kecuali untuk menjalankan menggunakan Python IDE?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Cukup gunakan python -m pdb <your_script>.py lalu b <line_number>untuk menyetel breakpoint pada nomor baris yang dipilih (tanpa tanda kurung fungsi). Tekan cuntuk melanjutkan ke breakpoint Anda. Anda dapat melihat semua breakpoint Anda menggunakan bperintah itu sendiri. Ketik helpuntuk melihat perintah pdb lain yang tersedia saat debugging.
arcseldon
1
Sejak Python 3.7, Anda sekarang dapat menggunakan breakpoint()fungsi bawaan . python.org/dev/peps/pep-0553
Daniel

Jawaban:

117

Anda dapat menjalankan program Anda pdbdari baris perintah dengan menjalankan

python -m pdb your_script.py

Ini akan rusak pada baris pertama, kemudian Anda akan dapat menambahkan titik putus di mana pun Anda inginkan dalam kode Anda menggunakan breakperintah, sintaksnya adalah:

b (reak) [[nama file:] lineno | fungsi [, kondisi]]

Ini cukup fleksibel untuk memberi Anda kemampuan untuk menambahkan breakpoint di mana saja.

mdeous
sumber
24
untuk memperjelas hal ini, jika saya pdb.set_trace()dan masuk ke debugger, gunakan lperintah (daftar) dan lihat bahwa saya ingin menetapkan breakpoint pada baris 27, saya kemudian akan masuk: b 27dan debugger akan menetapkan breakpoint pada baris 27 (saya menemukan dokumentasinya sedikit menantang untuk dipahami, jadi ingin menambahkan poin klarifikasi itu).
benjaminmgross
9
Juga, jika Anda memiliki sebuah objek x, dan Anda ingin berhenti ketika metodenya fdipanggil, Anda dapat mengucapkan break x.f, lalu c(ontinue). Ini berfungsi bahkan jika objek tersebut berada dalam file yang tidak dapat diakses atau dibuat secara dinamis, misalnya dengan menghapus centang.
osa
2
Saat men-debug setelah stacktrace Anda dapat menyalin jalur penuh ke modul dan menambahkan nomor baris sepertib /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
valid
58

Kamu bisa memakai:

from pdb import set_trace as bp

code
code
bp()
code
code
Apogentus
sumber
tidak yakin mengapa aliasing superflous, tapi ;-). Untuk beberapa alasan IDE / Editor (vscode) saya menjadi mare ini AM dan terus menggarisbawahi. Melihat komentar Anda sangat membantu saya. Semoga hari mu menyenangkan!
MrMesees
Terima kasih banyak!
ditambatkan
Bagaimana saya bisa memaksa untuk mengimpor set_tracehanya ketika saya menggunakan bp ()?
alper
39

Di vim, saya memiliki pengaturan makro untuk ini (di file .vimrc saya):

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

jadi saya cukup menekan \ b (bila tidak dalam Mode Sisipkan) dan menambahkan breakpoint setelah baris saat ini, atau \ B (perhatikan ibu kota) dan menempatkan satu sebelum baris saat ini.

yang tampaknya berfungsi dengan baik. Kebanyakan editor programmer 'sederhana' lainnya (emacs, sublimetext, dll) harus memiliki cara mudah yang serupa untuk melakukan ini.

Sunting: Saya sebenarnya punya:

au FileType python map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
au FileType python map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

yang menyalakannya hanya untuk file sumber python. Anda dapat dengan mudah menambahkan baris serupa untuk javascript atau bahasa lain apa pun yang Anda gunakan.

Pembaruan 2019 (Python 3.7+)

Python 3.7+ sekarang memiliki bawaan breakpoint()yang dapat menggantikan import pdb; pdb.set_trace()vim sebelumnya . Ini masih berfungsi sama.

Daniel
sumber
2
Solusi bagus, dan baris yang ditambahkan akan memiliki lekukan yang benar juga jika ada set autoindentdi file .vimrc Anda .
Jealie
Ya, saya tidak mengerti mengapa kebanyakan distro tidak dikirimkan dengan set autoindent(dan banyak pilihan lain) sebagai standar. Salah satu hal pertama yang saya lakukan dengan sistem baru adalah menarik vimrc yang lebih baik ...
Daniel
1
Cukup gunakan register bernama vim! Simpan baris yang ingin Anda buffer 'd' (seperti dalam d ebug) dengan menekan "dyydan kapan pun Anda membutuhkannya, lakukan "dpatau "dP. Pelajari register vim ! Mereka sangat berguna dan selalu didukung!
polvoazul
bagaimana menambahkan: w setelah itu?
ji-ruh
Mengambil konsep register bernama sedikit lebih jauh, Anda dapat merekam makro, melakukan operasi yang diperlukan, lalu menghentikan makro. Kemudian tempel konten makro ke file vimrc Anda. Misalnya, mulai makro dengan qd, lalu "dptempelkan nanti . Terakhir, tetapkan instruksi Anda ke register sehingga selalu diisi di vim loadup. Contoh: let @d = 'oimport pdb; pdb.set_trace()k0:w' Sekarang, cukup gunakan @dkapan pun Anda ingin menempelkan baris ke dalam file. Di atas juga menyimpan file. Tetapi Anda harus merekam milik Anda sendiri (daripada salin / tempel di atas) karena karakter khusus terlibat (untuk melarikan diri, dll).
arcseldon
27

Jika Anda tidak ingin mengatur breakpoint secara manual setiap kali menjalankan program (dengan Python 3.2+), misalnya Anda ingin langsung membuat breakpoint pada baris 3 dan menghentikan eksekusi di sana:

python -m pdb -c "b 3" -c c your_script.py

Informasi berikut dapat membantu:

Jika file .pdbrc ada di direktori home pengguna atau di direktori saat ini, file tersebut dibaca dan dijalankan seolah-olah telah diketik pada prompt debugger. Ini sangat berguna untuk alias. Jika kedua file tersebut ada, yang ada di direktori home dibaca terlebih dahulu dan alias yang ditentukan di sana dapat diganti oleh file lokal.

Berubah pada versi 3.2: .pdbrc sekarang dapat berisi perintah yang melanjutkan debugging, seperti lanjutkan atau berikutnya. Sebelumnya, perintah ini tidak berpengaruh.

Baru di versi 3.2: pdb.py sekarang menerima opsi -c yang menjalankan perintah seolah-olah diberikan dalam file .pdbrc, lihat Perintah Debugger.

AXO
sumber
23

Saya belum mencobanya tetapi mereka baru saja menerapkan built-in baru yang disebut breakpoint () dengan Python 3.7 yang berarti Anda dapat memasukkan breakpoint dengan satu pernyataan sekarang:

breakpoint()
Tagihan
sumber
1
Pada Python 3.7, inilah jawabannya.
eric
10

Ini adalah bagaimana Anda akan menggunakan pdb di baris perintah tanpa menerapkan apa pun di kode sumber Anda (dokumentasi dan sumber daya online lainnya tidak melakukan pekerjaan yang baik menjelaskan hal ini kepada programmer yang hanya menggunakan debugger visual di masa lalu):

Mulai pdb dengan mengetik berikut ini di prompt shell:

python -m pdb 'python_script'

Perintah ini menginisialisasi pdb dan debugger pdb akan berhenti di baris pertama python_script Anda dan menunggu masukan dari Anda:

(Pdb)

Ini adalah antarmuka untuk berkomunikasi dengan debugger. Sekarang, Anda dapat menentukan perintah Anda di sini. Menentang penggunaan tombol atau pintasan keyboard di debugger visual, di sini Anda akan menggunakan perintah untuk mendapatkan hasil yang sama.

Anda dapat beralih ke baris berikutnya dalam kode Anda dengan perintah "n" (berikutnya):

(Pdb) n

Melakukan selanjutnya akan menampilkan nomor baris, dan kode spesifik di sumber:

> python_script(line number)method name
-> current line in the source code

Anda dapat menyetel breakpoint dengan menentukan nomor baris di kode sumber Anda.

(Pdb) b 50

Di sini, debugger disetel ke breakpoint pada baris 50. Jika tidak ada breakpoint lain, breakpoint pada baris 50 akan menjadi yang pertama dan bisa direferensikan oleh id breakpoint yaitu 1 dalam kasus ini. Jika Anda menambahkan lebih banyak break point, mereka akan mendapatkan pengenal secara berurutan (yaitu, 2, 3 dll.)

Setelah breakpoint ditetapkan, Anda akan terus menjalankan program Anda sampai pdb mencapai breakpoint sebagai berikut:

(Pdb) c

Setelah Anda mencapai breakpoint, Anda bisa pergi ke baris berikutnya, dengan perintah n seperti yang dijelaskan sebelumnya. Jika Anda ingin memeriksa nilai variabel, Anda akan menjalankan perintah parameter sebagai berikut:

(Pdb) p variable_name

Jika Anda tidak lagi membutuhkan breakpoint, Anda dapat menghapusnya dengan meneruskan id dari breakpoint dengan perintah clear:

(Pdb) clear 1

Terakhir, setelah Anda selesai dengan debugger, Anda dapat keluar dari eksekusi seperti saat Anda keluar dari interpreter baris perintah python.

(Pdb) exit()

Saya harap ini akan membantu siapa saja untuk memulai dengan pdb. Berikut adalah daftar perintah yang dapat Anda gunakan dengan debugger: pdb jadi tanya jawab

picmate 涅
sumber
4

Anda dapat menggunakan IDE yang mendukung debugging python, atau Anda dapat memeriksa alat Winpdb yang sangat baik. Yang berfungsi pada platform apa pun dan menyediakan fasilitas debugging grafis ke skrip python Anda.

http://winpdb.org/

Glenjamin
sumber
2

Kamu bisa memakai:

  • ide sayap
  • gerhana dengan plugin pydev
  • buah pohon cemara

Semua dukungan di atas python debugging dari dalam IDE.

vvatsa
sumber
0

Di Atom jika plugin Python diinstal, Anda cukup mengetik 'pdb ' dan tekan enter dan potongan akan mengetikkan impor dan penelusuran kembali untuk Anda.

Saya sudah terbiasa dengan ini sekarang karena terkadang saya hanya mengetiknya bahkan jika saya mengeditnya di vim dan menunggu dropdown muncul.

Simpleks
sumber
0

Metode yang diremehkan adalah menyetel breakpoint di pdb secara langsung:

pdb> b torch/__init__:10

akan mengatur breakpoint site-packages\torch\__init__.py:10

Kemudian pdb> c akan berhenti di breakpoint ini.

Berikut ini juga valid:

pdb> b d:\anaconda\lib\site-packages\torch\__init__.py:10
pdb> b torch\__init__.py:10
pdb> b d:\\anaconda\\lib\\site-packages\\torch\\__init__.py:10
pdb> b d:/anaconda/lib/site-packages/torch/__init__.py:10

Lihat dokumen untuk detailnya.

Dewan Januari
sumber
0

Anda dapat menggunakan Vim dengan plugin Python-Mode atau Emacs dengan Elpy plugin .

Plugin ini memberi Anda breakpoint dengan penekanan tombol yang mudah ( \ bdi Vim dan C-c C-u bEmacs) ditambah banyak fitur lain dari IDE kelas berat (pelipatan kode, pemfaktoran ulang, linting, dll.) - semua dalam editor teks berbasis terminal yang ringan.

Chris Abraham
sumber
-1

Cara termudah untuk menjalankan debugger pada skrip Anda adalah

pdb your_script.py

Menjalankan pdb pada baris perintah Linux memberikan

usage: pdb.py scriptfile [arg] ...
timbo
sumber
Bagaimana cara menginstall pdb? Atau dari mana?
kenorb