Apa cara yang benar untuk men-debug di notebook iPython?

121

Seperti yang saya tahu, %debug magicbisa melakukan debug dalam satu sel.

Namun, saya memiliki panggilan fungsi di beberapa sel.

Sebagai contoh,

In[1]: def fun1(a)
           def fun2(b)
               # I want to set a breakpoint for the following line #
               return do_some_thing_about(b)

       return fun2(a)

In[2]: import multiprocessing as mp
       pool=mp.Pool(processes=2)
       results=pool.map(fun1, 1.0)
       pool.close()
       pool.join

Apa yang saya coba:

  1. Saya mencoba mengatur %debugdi baris pertama sel-1. Tapi itu segera masuk ke mode debug, bahkan sebelum mengeksekusi sel-2.

  2. Saya mencoba menambahkan %debugbaris tepat sebelum kode return do_some_thing_about(b). Tapi kemudian kode berjalan selamanya, tidak pernah berhenti.

Apa cara yang benar untuk menetapkan titik putus di dalam notebook ipython?

Rex
sumber

Jawaban:

72

Gunakan ipdb

Instal melalui

pip install ipdb

Pemakaian:

In[1]: def fun1(a):
   def fun2(a):
       import ipdb; ipdb.set_trace() # debugging starts here
       return do_some_thing_about(b)
   return fun2(a)
In[2]: fun1(1)

Untuk menjalankan penggunaan baris demi baris ndan untuk masuk ke fungsi, gunakan sdan keluar dari penggunaan prompt debugging c.

Untuk daftar lengkap dari perintah yang tersedia: https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf

Tevin Joseph KO
sumber
ipdb tidak memberi saya prompt debug di sel lain dengan kode contoh yang disebutkan dalam pertanyaan. Sekarang kode tersebut terus berjalan selamanya.
Rex
@Rex Bagi saya itu berhasil. Di mana Anda meletakkan ipdb? Masukkan ipdb impor; ipdb.set_trace (); sebelum baris kembali do_some_thing_about (b). Kemudian, panggil fun1 (a) dari sel kedua, itu akan berfungsi. Untuk keluar dari perintah debugging, gunakan 'c'
Tevin Joseph KO
@Rex Memperbarui jawaban agar lebih jelas.
Tevin Joseph KO
29
Ini berfungsi di konsol iPython tetapi tidak di notebook iPython (yang pertanyaannya diajukan). Saat saya mengetik di import ipdb; ipdb.set_trace()dalam sel notebook, tertulisMultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
Bill
1
baru mengenal jupyter ... tampaknya lebih cocok untuk presentasi dan berbagi cuplikan kode ... dapatkah kita memiliki fungsionalitas yang disediakan IDE (seperti eclipse, rstudio) seperti debugging aktual, step through, breakpoints, menambahkan jam tangan ke ekspresi dan variabel dll. Pada awalnya, tampaknya tidak demikian, hanya ingin memastikan .....
Mahesha999
90

Anda dapat menggunakan ipdbjupyter dalam dengan:

from IPython.core.debugger import Tracer; Tracer()()

Edit : fungsi di atas tidak digunakan lagi sejak IPython 5.1. Ini adalah pendekatan baru:

from IPython.core.debugger import set_trace

Tambahkan di set_trace()mana Anda membutuhkan breakpoint. Ketik helpuntuk ipdbperintah ketika field input muncul.

Leopd
sumber
20
Tracerdisusutkan. Sekarang bekerja seperti ini: from IPython.core.debugger import set_tracedan set_trace()membangkitkan breakpoint. Sumber: davidhamann.de/2017/04/22/debugging-jupyter-notebooks
Anton Tarasenko
1
Berguna untuk digunakan sebagai satu baris, di mana pun diperlukan:from IPython.core.debugger import set_trace;set_trace()
Nir
15

Fungsi pengembalian Anda sejalan dengan fungsi def (fungsi utama), Anda harus memberikan satu tab padanya. Dan Gunakan

%%debug 

dari pada

%debug 

untuk men-debug seluruh sel tidak hanya baris. Semoga ini bisa membantu Anda.

Mohit Khurana
sumber
12

Anda selalu dapat menambahkan ini di sel mana pun:

import pdb; pdb.set_trace()

dan debugger akan berhenti di baris itu. Sebagai contoh:

In[1]: def fun1(a):
           def fun2(a):
               import pdb; pdb.set_trace() # debugging starts here
           return fun2(a)

In[2]: fun1(1)
krock
sumber
Haruskah itu ipdb?
Rex
1
@Rex Belum tentu. ipdbadalah refactor dari Python Debugger yang lebih terintegrasi dengan IPython. pdbsudah terpasang.
Two-Bit Alchemist
ipdbjuga dapat digunakan di luar shell ipython dan dilengkapi dengan beberapa kemudahan seperti penyelesaian tab.
Jan
12

Di Python 3.7 Anda bisa menggunakan fungsi breakpoint () . Masuk saja

breakpoint()

di mana pun Anda ingin runtime berhenti dan dari sana Anda dapat menggunakan perintah pdb yang sama (r, c, n, ...) atau mengevaluasi variabel Anda.

Vlad Bezden
sumber
2
Untuk menambahkan ini, ketika Anda memanggil breakpoint (), Anda dapat mengetik 'bantuan' di kotak teks yang muncul untuk mendapatkan daftar perintah.
gbeaven
Tampaknya ada masalah terus-menerus saat menutup telepon setelah menggunakan breakpoint () atau pdb: github.com/ipython/ipython/issues/10516
Dave Liu
8

Cukup ketik import pdbdi notebook jupyter, dan kemudian menggunakan ini cheatsheet untuk debug. Sangat nyaman.

c-> lanjutkan, s-> langkah, b 12-> set break point pada baris 12 dan seterusnya.

Beberapa tautan berguna: Dokumen Resmi Python di pdb , contoh debugger Python pdb untuk lebih memahami cara menggunakan perintah debugger .

Beberapa tangkapan layar yang berguna: masukkan deskripsi gambar di sinimasukkan deskripsi gambar di sini

bunga
sumber
Jawaban yang bagus. Namun, saya pikir (saya baru mengenal notebook Jupyter) seseorang harus menambahkan% debug untuk menetapkan breakpoint.
Ad Infinitum
Yang saya lakukan adalah salin dan tempel pdb.set_trace()ke tempat saya ingin menetapkan breakpoint, karena b line_notidak berfungsi di Notebook Jupyter dan berfungsi dengan baik di python IDLE.
flowera
Terima kasih! Saya juga mengunggah beberapa tangkapan layar yang saya uji hari ini. Jika saya bisa beralih ke Python IDLE, saya akan senang melakukannya ..
flowera
Juga, saya menemukan cara untuk menunjukkan nomor baris pada notebook jupyter, klik baris baru, lalu tekan l. Tentu saja Anda juga dapat memprogram pintasan Anda sendiri, tautan tersedia di situs web notebook jupyter.
flowera
1
Saya selalu menggunakan "p" untuk menampilkan daftar perintah di notebook Jupyter. Ketika saya menulis "tampilkan nomor baris", perintah muncul di sana dengan pintasan di sebelahnya. Anda juga dapat mempelajari pintasan dari perintah yang ingin Anda gunakan.
Ad Infinitum
8

Setelah Anda mendapatkan kesalahan, di sel berikutnya jalankan saja %debugdan hanya itu.

Escachator
sumber
1
itu mengagumkan!
Seseorang
Namun, ini harus menunggu pengecualian terjadi, kita mungkin ingin menguji apa itu variabel dalam runtime dengan menetapkan beberapa breakpoint
Luk Aron
7

The %pdbperintah sihir baik untuk menggunakan juga. Katakan saja %pdb ondan selanjutnya pdbdebugger akan berjalan di semua pengecualian, tidak peduli seberapa dalam tumpukan panggilan. Sangat berguna.

Jika Anda memiliki baris tertentu yang ingin Anda debug, cukup buat pengecualian di sana (sering kali Anda sudah memilikinya!) Atau gunakan %debugperintah ajaib yang disarankan orang lain.

tahan air
sumber
5

Saya baru saja menemukan PixieDebugger . Meskipun saya belum sempat mengujinya, ini benar-benar cara yang paling mirip untuk men-debug seperti yang kita gunakan di ipython dengan ipdb

masukkan deskripsi gambar di sini

Ini juga memiliki tab "evaluasi"

Alessandro Dentella
sumber
0

Debugger asli tersedia sebagai ekstensi untuk JupyterLab. Dirilis beberapa minggu yang lalu, ini dapat diinstal dengan mendapatkan ekstensi yang relevan, serta kernel xeus-python (yang terutama hadir tanpa sihir yang dikenal oleh pengguna ipykernel):

jupyter labextension install @jupyterlab/debugger
conda install xeus-python -c conda-forge

Hal ini memungkinkan pengalaman debugging visual yang terkenal dari IDE lain.

masukkan deskripsi gambar di sini

Sumber: Debugger visual untuk Jupyter

fuglede
sumber
xeus-python tidak berjalan di Windows 10. Periksa masalah saya Masalah xeus-python di github
sergzemsk