SORU
31 Mayıs 2013, Cuma


Adım adım hata ayıklama İPython

Ben okudum kadarıyla, Python kod hata ayıklama için iki yol vardır:

  • pdb ipdb gibi geleneksel bir hata ayıklayıcı. Bu continue, n step-into step-over, s vb. c gibi komutlar) destekler, ama nesne denetim için son derece yararlı olabilir İPython kabuk doğrudan erişim yok.

  • KullanarakİPythonembedding ile bir İPython kodunuzu kabuk. from ipython import embed, ve kod embed() kullanabilirsiniz. Program/komut dosyası embed() deyimi çarptığında, İPython kabuk içine düştü. Bu nesnelerin tam denetim ve Python kodu İPython tüm güzellikler kullanarak test sağlar. embed() kullanırken ancak, yapamazsınadım adımkod içinde kullanışlı klavye kısayolları ile artık.

Her iki dünyanın en iyi birleştirmek için bir yolu var mı? I. e.

  1. Edebilmekadım adımklavye kısayolları/ipdb kullanışlı pdb ile kod ile.
  2. Bu tür herhangi bir adım At (belirli bir deyim vb.), tam teşekküllü bir erişim varİPython kabuk.

İPython hata ayıklamagibiMATLAB:

Hata ayıklama" kullanıcı MATLAB nerede bulunabilir,. "geliştirilmiş, bu tip bir örnek ^strong>her zamanMATLAB motoru tam erişim kabuk vardır, ve hala olabiliradım adımonu kod ile, koşullu kesme noktaları, vb tanımlamak. Diğer kullanıcıların anlattığım kadarıyla, bu insanlar İPython için MATLAB taşırken en çok özlediğim hata ayıklama özelliği.

İPython Emacs ve diğer editörler hata ayıklama:

Bu soru çok spesifik hale getirmek istemiyorum, ama eğer bu içine işlevsellik getirmek için herhangi bir yolu varsa merak ediyorum bu yüzden çoğunlukla Emacs içinde çalışıyorum.İdealEmacs (veya editör) izin programcı kesme seti üzerinde herhangi bir yere Kodu ve iletişim ile sözlü ya da hata var yapma yeri seçiminiz, ve getirmek için bir tam İPython tercümanın o bölgede.

CEVAP
30 NİSAN 2014, ÇARŞAMBA


Bir yıl sonra, ve hata ayıklama Python, herşeyi bu konu içinde belirtilen de dahil olmak üzere pek çok farklı yöntem denedim sonra, İPython ile Python hata ayıklama benim tercih yollarından biri gömülü kabukları ile.

Özel İPython kabuk gömülü tanımlama:

Senin için bir komut dosyası yöntemi ipsh() kullanılabilir böylece 14**, aşağıdakileri Ekle.

import inspect

# First import the embed function
from IPython.terminal.embed import InteractiveShellEmbed
from IPython.config.loader import Config

# Configure the prompt so that I know I am in a nested (embedded) shell
cfg = Config()
prompt_config = cfg.PromptManager
prompt_config.in_template = 'N.In <\\#>: '
prompt_config.in2_template = '   .\\D.: '
prompt_config.out_template = 'N.Out<\\#>: '

# Messages displayed when I drop into and exit the shell.
banner_msg = ("\n**Nested Interpreter:\n"
"Hit Ctrl-D to exit interpreter and continue program.\n"
"Note that if you use %kill_embedded, you can fully deactivate\n"
"This embedded instance so it will never turn on again")   
exit_msg = '**Leaving Nested interpreter'

# Wrap it in a function that gives me more context:
def ipsh():
    ipshell = InteractiveShellEmbed(config=cfg, banner1=banner_msg, exit_msg=exit_msg)

    frame = inspect.currentframe().f_back
    msg   = 'Stopped at {0.f_code.co_filename} at line {0.f_lineno}'.format(frame)

    # Go back one level! 
    # This is needed because the call to ipshell is inside the function ipsh()
    ipshell(msg,stack_depth=2)

Benim kodda bir hata ayıklama için ne zaman istersem o zaman, nesne denetim, vb yapmam gereken yere doğru ipsh() yer. Örneğin, my_function aşağıda hata ayıklama

Bunu kullanarak:

def my_function(b):
  a = b
  ipsh() # <- This will embed a full-fledged IPython interpreter
  a = 4

ve sonra aşağıdaki yollardan birini my_function(2) çağır:

  1. Ya bir Python programı çalıştırarak bir Unıx kabuk bu işlevini çağırır
  2. Ya İPython doğrudan çağırarak

Ben, yorumlayıcı durur satırında çağırmak ne olursa olsun, bu ipsh() diyor. Bir kez yapılır, Ctrl-D Python yürütme yaptığınız herhangi bir değişken güncellemeleri ile) devam edecektir yapabilirsin. Eğer düzenli bir İPython İPython kabuk (durum 2) yukarıdaki kodu çalıştırırsanız, yeni İPython kabuk olacağını unutmayıniç içe geçmişgayet iyi, hangisinin sizi çağrılan kişi, içeride, ama iyi farkında olmak. Her halükarda, bir zamanlar tercüman durak yeri ipsh, ben kontrol değeri a (2), bakın ne işlevler ve nesneler tanımlanmış, vb.

Sorun:

Çözüm yukarıda Python ile her yere kodunuzu durdurmak ve tam teşekküllü İPython bir tercüman içine koyduktan sonra kullanılabilir. Ne yazık ki sen ya da son derece sinir bozucu olan bu senaryo, bir kez çağırmak kesme noktası Ekle / Kaldır izin vermez. Benim görüşüme göre, busadeceşey Python için büyük bir hata ayıklama aracı olmaktan İPython engelliyor.

En iyisi şimdi yapabilirsiniz:

Geçici bir çözüm Python yorumlayıcısı İPython kabuk (breakpoint i.e.) başlatmak için istediğiniz farklı konumlarda ipsh() önsel yerleştirmektir. Sonra "git" arasında farklı önceden tanımlanmış, kodlanmış "kesme" ile Ctrl-D, hangisi çıkış mevcut gömülü İPython kabuk ve dur bir daha ne zaman tercüman çarptığı sırada ipsh().

Eğer gidersen bu yol, tek yönlü çıkış "hata ayıklama modu" ve görmezden sonraki tüm kesme noktaları için kullanın ipshell.dummy_mode = True hangi yapar Python görmezden izleyen herhangi bir örneklemesi olan ipshell nesne yarattık yukarıda.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • David Wills

    David Wills

    31 Aralık 2007
  • 10 Daughters, 2 Sons

    10 Daughters

    10 Mart 2009
  • kimberly p

    kimberly p

    23 Ocak 2010