2011-11-03 17 views
6

Kısa bir süre önce ipython0.10'dan ipython0.11'e geçtim. Ipython0.11'de, yalnızca python hata ayıklayıcısını çalıştırdığında (yani %pdb kullanarak) tam traceback'in küçük bir parçacığını görüyorum, oysa ipython0.10'da tam izini görebiliyordum. Anlayabildiğim kadarıyla, tam geri izleme doğrudan pdb komut satırından erişilemez - bununla birlikte 'u' ile gezinebilir, ancak doğrudan göremezsiniz.ipython debugger: etkileşimli pdb'de tam iz?

Tam izini göstermenin herhangi bir yolu var mı? Bir yapılandırma parametresi gibi?

Veya daha da kullanışlı olarak, ipython'un yakalanan Özel Durum'u göstermesi için herhangi bir yol var mı?

DÜZENLEME: Örnek:

In [1]: pdb 
Automatic pdb calling has been turned ON 

In [2]: 1/0 
> <ipython-input-2-05c9758a9c21>(1)<module>() 
    -1 1/0 

ipdb> q 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 
/Users/adam/<ipython-input-2-05c9758a9c21> in <module>() 
----> 1 1/0 

ZeroDivisionError: integer division or modulo by zero 

Ben pdb dışına ingq' önce ZeroDivisionError görmek istiyorum.

+1

Bu, IPython 0'daki bir hatadır.11 - Geri tepme, hata ayıklayıcısını, başlamadan önce değil, ayrıldıktan sonra yazdırılır. 0.12 (Noel öncesi olmalıdır) için düzeltilecektir. –

cevap

6

ipython sadece ziyade kodda bunun yakalandı nerede göstermek yerine, yakalandı İstisna göstermek için herhangi bir yolu var mı?

Sen sys.excepthook kullanabilirsiniz:

import sys 

def exc_hook(type, value, traceback): 
    print type 

sys.excepthook = exc_hook 

sys module documentation Gönderen:

sys.excepthook(type, value, traceback)

Bu fonksiyon sys.stderr belirli bir Traceback ve istisna dışında yazdırır. Bir özel duruma ve yakalanmamış zaman

, yorumlayıcı üç parametreyle, özel sınıfı, özel örneği ve bir traceback nesnesiyle sys.excepthook çağırır. Etkileşimli bir oturumda, bu denetimin istemciye döndürülmesinden hemen önce gerçekleşir; Python programında bu, programın çıkmasından hemen önce gerçekleşir. gibi üst düzey istisnaların işlenmesi, üç argüman fonksiyonunu sys.excepthook'a atayarak özelleştirilebilir. sys.__excepthook__

Bu nesneler

sys.__displayhook__

program başlangıcında displayhook ve excepthook orijinal değerleri içerir. displayhook ve excepthook'un kırık nesnelerle değiştirilmeleri durumunda geri yüklenebilmesi için kaydedilirler.


Ayrıca IPython reference itibaren Plain

ayarlı --xmode seçeneğiyle ipython başlayan deneyebilirsiniz: istisna raporlama için

$ ipython [options] files 

--xmode=<modename> 

Mod.

Geçerli modlar: Düz, Bağlam ve Verbose.

Düz: python'un normal geri tepme baskısına benzer.

Bağlam: geri izlemede her satırın etrafında 5 satırlık içerik kaynağı kodu yazdırır.

Ayrıntılı: Bağlam benzer, ancak ek olarak istisna (çok uzun eğer onların dizeleri kısaltarak) meydana geldiği değişkenler şu anda görünür yazdırır. Bu, , dizge gösterimi karmaşık hesaplamak için büyük bir veri yapısına sahip olursanız, çok yavaş olabilir. Bilgisayarınız cpu % 100'de bir süre donmuş gibi görünebilir. Bu durumda, Ctrl-C ile traceback'i iptal edebilirsiniz (belki birden fazla kez vurabilir).

Bazı kullanım örnekleri aşağıda verilmiştir.

--xmode=Plain:

[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Plain ipython-debugger-full-traceback-on-interactive-pdb.py 
------------------------------------------------------------ 
Traceback (most recent call last): 
    File "ipython-debugger-full-traceback-on-interactive-pdb.py", line 2, in <module> 
    1/0 
ZeroDivisionError: integer division or modulo by zero 

--xmode=Context:

[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Context ipython-debugger-full-traceback-on-interactive-pdb.py 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 

/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>() 
     1 
----> 2 #!/usr/bin/python 
     3 1/0 
     4 
     5 

ZeroDivisionError: integer division or modulo by zero 

--xmode=Verbose:

her traceback hatlarında farkı dikkat

--xmode=Plain:

[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Plain 

In [1]: 1/0 
------------------------------------------------------------ 
Traceback (most recent call last): 
    File "<ipython console>", line 1, in <module> 
ZeroDivisionError: integer division or modulo by zero 

--xmode=Context:

[ 20:03 [email protected] ~/SO/python ]$ ipython --xmode=Context 

In [1]: 1/0 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 

/home/jon/SO/python/<ipython console> in <module>() 

ZeroDivisionError: integer division or modulo by zero 

--xmode=Verbose:

Ve .py dosyası belirtmeden

[ 20:01 [email protected] ~/SO/python ]$ ipython --xmode=Verbose 


In [1]: 1/0 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 

/home/jon/SO/python/<ipython console> in <module>() 

ZeroDivisionError: integer division or modulo by zero 

Using the Python debugger.

+0

Mesajınızın ikinci kısmı (--xmode) yanıt gibi görünüyor, ancak işe yaramıyor gibi görünüyor. Tüm 3 modenamesini denedim ve geri çekilme hepsi aynı görünüyor. Buna neyin sebep olduğu hakkında bir fikrin var mı? – keflavich

+1

Yukarıdaki düzenlemelerime bakın. – chown

+0

Teşekkürler. Ne yazık ki, bu da (benim kopyasını?) Ipython bir hata olduğunu işaret eder: $ ipython - xmode = Düz UYARI: Tanınmayan diğer adlar: 'xmode', muhtemelen hiçbir etkisi olmaz. Ancak, ipython bir kez : [1] 'de:% xmode İstisna raporlama modu: Düzgün çalışıyor – keflavich