(28 Mayıs 2016'da Güncelleme) Emacs'ta RealGUD Kullanımı
Emacs'taki herkes için bu iş parçacığı OP (ve diğer) öğesinde açıklanan her şeyin nasıl kullanılacağını gösterir.
- Emacs'ta RealGUD adı verilen ve herhangi bir hata ayıklayıcı ile çalışabilecek yeni bir önemli hata ayıklayıcı (
ipdb
) .
- Emacs paketi
isend-mode
.
Bu iki paketin kombinasyonu son derece güçlüdür ve OP'de açıklanan davranışı tam olarak yeniden oluşturmasına ve daha fazlasını yapmasına izin verir.
İpdb için RealGUD'un wiki makalesi hakkında daha fazla bilgi .
Orijinal cevap:
Python'da hata ayıklamak için birçok farklı yöntem denedikten sonra, bu iş parçacığında bahsedilen her şey dahil, Python'u IPython ile hata ayıklamak için tercih ettiğim yollardan biri gömülü kabuklarla.
Özel bir katıştırılmış IPython kabuğu tanımlama:
PYTHONPATH
Yöntemin ipsh()
kullanılabilir olması için aşağıdakine komut dosyasında ekleyin .
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)
Daha sonra, kodumda bir şey hata ayıklamak istediğimde, ipsh()
nesne denetimi vb. Yapmam gereken yere yerleştiriyorum. Örneğin, hata ayıklamak istediğimi söyleyinmy_function
aşağıda
Kullanma:
def my_function(b):
a = b
ipsh() # <- This will embed a full-fledged IPython interpreter
a = 4
ve sonra my_function(2)
aşağıdaki yollardan biriyle çağırıyorum :
- Bu işlevi bir Unix kabuğundan çağıran bir Python programı çalıştırarak
- Veya doğrudan IPython'dan çağırarak
Nasıl çağırdığımdan bağımsız olarak, tercüman söyleyen satırda durur ipsh()
. İşiniz bittiğinde, bunu yapabilirsiniz Ctrl-D
ve Python yürütmeye devam eder (yaptığınız değişken güncellemelerle). Eğer (olgu yukarıdaki 2) düzenli ipython ipython kabuk kodunu çalıştırırsanız, unutmayın, yeni ipython kabuk edilecektir yuvalanmış gayet olumlu bunu çağrılan hangi birine içeride, ama onun iyi farkında olmak. Her iki durumda da, tercüman bulunduğu yerde durduğunda, (ki ) ipsh
değerini inceleyebilir, hangi işlevlerin ve nesnelerin tanımlandığını vb. Görebilirim.a
2
Sorun:
Yukarıdaki çözüm, Python'un kodunuzda istediğiniz yerde durmasını ve ardından sizi tam teşekküllü bir IPython yorumlayıcısına bırakmasını sağlamak için kullanılabilir. Ne yazık ki son derece sinir bozucu olan komut dosyasını çağırdıktan sonra kesme noktaları eklemenize veya kaldırmanıza izin vermez. Bence, IPython'un Python için harika bir hata ayıklama aracı olmasını engelleyen tek şey bu.
Şimdilik yapabileceğiniz en iyi şey:
Geçici çözüm, ipsh()
Python yorumlayıcısının bir IPython kabuğu (ör. A breakpoint
) başlatmasını istediğiniz farklı konumlara bir a priori yerleştirmektir . Ardından, önceden tanımlanmış farklı sabit kodlu "kesme noktaları" arasında "atlayabilir" Ctrl-D
ve bu, geçerli katıştırılmış IPython kabuğundan çıkıp yorumlayıcı bir sonraki çağrıya her bastığında yeniden durabilir ipsh()
.
Bu rotaya giderseniz, "hata ayıklama modundan" çıkmanın ve sonraki tüm kesme noktalarını göz ardı etmenin bir yolu, ipshell.dummy_mode = True
Python'un ipshell
yukarıda oluşturduğumuz nesnenin sonraki örneklerini yok saymasını sağlayacak şekilde kullanmaktır .
!
kesme noktasında herhangi bir python komutunu yürüten komuta sahiptir