İPython dizüstü bilgisayarda hata ayıklamanın doğru yolu nedir?


121

Bildiğim gibi, %debug magicbir hücre içinde hata ayıklama yapabilir.

Ancak, birden çok hücrede işlev çağrılarım var.

Örneğin,

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

Ne denedim:

  1. %debug1 numaralı hücrenin ilk satırını ayarlamaya çalıştım . Ancak hücre-2'yi çalıştırmadan hemen önce hata ayıklama moduna girer.

  2. %debugKodun hemen önündeki satırı eklemeye çalıştım return do_some_thing_about(b). Ama sonra kod sonsuza kadar çalışır, asla durmaz.

İpython not defterinde bir kesme noktası belirlemenin doğru yolu nedir?

Yanıtlar:


72

İpdb kullan

Şununla kurun

pip install ipdb

Kullanımı:

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)

Satır satır çalıştırmak nve bir işleve adım satmak için ve hata ayıklama komut isteminden çıkmak için c.

Mevcut komutların tam listesi için: https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf


ipdb bana soruda belirtilen örnek kodla diğer hücrede hata ayıklama istemini vermiyor. Artık kod sonsuza kadar çalışıyor.
Rex

@Rex Benim için çalışıyor. İpdb'yi nereye koydunuz? İthal ipdb koy; ipdb.set_trace (); satırdan önce do_some_thing_about (b) döndürür. Ardından, ikinci hücreden fun1 (a) 'yı arayın, çalışmalıdır. Hata ayıklama isteminden çıkmak için 'c' kullanın
Tevin Joseph KO

@Rex Daha fazla netlik için cevabı güncelledi.
Tevin Joseph KO

29
Bu, iPython konsolunda çalışır ancak iPython dizüstü bilgisayarda çalışmaz (sorulan soru buydu). Bir import ipdb; ipdb.set_trace()not defteri hücresine yazdığımda şöyle diyorMultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
Bill

1
jupyter için yeni ... kod parçacıkları sunumu ve paylaşımı için daha uygun görünüyor ... IDE'lerin (tutulma, rstudio gibi) gerçek hata ayıklama, adım adım, kesme noktaları, ifadeye saat ekleme ve değişkenler vb. İlk başta, durum böyle değil gibi görünüyor, sadece emin olmak istiyorum .....
Mahesha999

90

ipdbJupyter içinde aşağıdakilerle kullanabilirsiniz :

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

Düzenleme : Yukarıdaki işlevler IPython 5.1'den beri kullanımdan kaldırılmıştır. Bu yeni yaklaşım:

from IPython.core.debugger import set_trace

set_trace()Bir kesme noktasına ihtiyacınız olan yeri ekleyin . Tip helpiçin ipdbgiriş alanı göründüğünde komutları.


20
Traceramortismana tabi tutuldu. Şimdi bu şekilde çalışıyor: from IPython.core.debugger import set_traceve set_trace()bir kesme noktası çağrıştırıyor. Kaynak: davidhamann.de/2017/04/22/debugging-jupyter-notebooks
Anton Tarasenko

1
Gerektiğinde tek hat olarak kullanmak kullanışlı:from IPython.core.debugger import set_trace;set_trace()
Nir

15

Dönüş işleviniz def işlevi (ana işlev) doğrultusunda, ona bir sekme vermelisiniz. Ve kullan

%%debug 

onun yerine

%debug 

sadece satırın tamamında hata ayıklamak için. Umarım, belki bu sana yardımcı olur.


12

Bunu her zaman herhangi bir hücreye ekleyebilirsiniz:

import pdb; pdb.set_trace()

ve hata ayıklayıcı bu satırda duracaktır. Örneğin:

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

In[2]: fun1(1)

Bu ipdb olmalı mı?
Rex

1
@Rex Mutlaka değil. ipdbIPython ile daha yakından entegre olan Python Hata Ayıklayıcısının bir yeniden düzenleyicisidir. pdbyerleşiktir.
Two-Bit Alchemist

ipdbipython kabuğunun dışında da kullanılabilir ve sekme tamamlama gibi bazı kolaylıklar ile birlikte gelir.
Jan

12

Python 3.7'de breakpoint () işlevini kullanabilirsiniz. Sadece girin

breakpoint()

çalışma zamanının durmasını istediğiniz her yerde ve oradan aynı pdb komutlarını (r, c, n, ...) kullanabilir veya değişkenlerinizi değerlendirebilirsiniz.


2
Buna eklemek için, breakpoint () 'i çağırdığınızda, komutların bir listesini almak için görünen metin kutusuna' yardım 'yazabilirsiniz.
gbeaven

Kesme noktası () veya pdb kullanıldıktan sonra kalıcı bir kapatma sorunu var gibi görünüyor: github.com/ipython/ipython/issues/10516
Dave Liu

8

import pdbJupyter not defterini yazın ve ardından hata ayıklamak için bu hile sayfasını kullanın. Çok uygun.

c-> devam et, s-> adım, b 12-> 12. satırda kesme noktası ayarla vb.

Bazı yararlı linkler: Python Resmi Belge pdb üzerinde , daha iyi ayıklayıcı komutlarını nasıl kullanılacağını anlamak için Python pdb ayıklayıcı örnekleri .

Bazı yararlı ekran görüntüleri: görüntü açıklamasını buraya giringörüntü açıklamasını buraya girin


İyi cevap. Ancak, (Jupyter not defterinde yeniyim) bir kesme noktası ayarlamak için% hata ayıklama eklemesi gerektiğini düşünüyorum.
Ad Infinitum

Yaptığım şey, pdb.set_trace()bir kesme noktası ayarlamak istediğim yere kopyalayıp yapıştırmak , çünkü b line_noJupyter Notebook'ta çalışmıyor ve python IDLE üzerinde iyi çalışıyor.
flowera

Teşekkürler! Ayrıca bugün test ettiğim bazı ekran görüntülerini de yükledim. Python
IDLE'ye geçebilseydim

Ayrıca, Jupyter not defterinde satır numarasını göstermenin bir yolunu buluyorum, yeni satıra tıklıyorum ve ardından l tuşuna basıyorum. Elbette kendi kısayolunuzu da programlayabilirsiniz, bağlantılar jupyter defter web sitesinde mevcuttur.
flowera

1
Jupyter not defterinde komutların listesini göstermek için her zaman "p" kullanırım. "Satır numaralarını göster" yazdığımda, komut, yanında kısayol ile beliriyor. Ayrıca kullanmak istediğiniz komutun kısayolunu da öğrenebilirsiniz.
Ad Infinitum

8

Bir hata aldıktan sonra, bir sonraki hücrede sadece çalıştırın %debugve bu kadar.


1
bu harika!
Birisi

ancak, bu istisnanın oluşmasını beklemelidir, bir kesme noktası ayarlayarak çalışma zamanında değişkenin ne olduğunu test etmek isteyebiliriz
Luk Aron

7

%pdbSihirli komut yanı kullanmak iyidir. Sadece söyleyin %pdb onve ardından pdbhata ayıklayıcı, çağrı yığınının derinliklerinde olursa olsun tüm istisnalarda çalışacaktır. Çok kullanışlı.

Hata ayıklamak istediğiniz belirli bir satırınız varsa, sadece orada bir istisna oluşturun (genellikle zaten öyledir!) Veya %debugdiğer insanların önerdiği sihirli komutu kullanın .


5

PixieDebugger'ı yeni keşfettim . Henüz test etmek için zamanım olmadığını düşünsem bile, ipdb ile ipython'da kullandığımız gibi hata ayıklamanın en benzer yolu gerçekten görünüyor

görüntü açıklamasını buraya girin

Aynı zamanda bir "değerlendirme" sekmesi vardır


0

JupyterLab'in bir uzantısı olarak yerel bir hata ayıklayıcı kullanıma sunuluyor. Birkaç hafta önce piyasaya sürülen bu, ilgili uzantının yanı sıra xeus-python çekirdeği (özellikle ipykernel kullanıcıları tarafından iyi bilinen büyüler olmadan gelir) alınarak yüklenebilir:

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

Bu, diğer IDE'lerden iyi bilinen görsel bir hata ayıklama deneyimi sağlar.

görüntü açıklamasını buraya girin

Kaynak: Jupyter için görsel bir hata ayıklayıcı


xeus-python Windows
10'umda çalışmıyor.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.