Hata ayıklama ihtiyaçlarım pdb
için oldukça iyi. Ancak, girebilseydim çok daha havalı (ve faydalı) olurdu ipython
. Bu mümkün mü?
Yanıtlar:
ipdb
İPython'u standart pdb'ye yerleştiren bir proje var, yani şunları yapabilirsiniz:
import ipdb; ipdb.set_trace()
Her zamanki gibi kurulabilir pip install ipdb
.
ipdb
oldukça kısadır, bu nedenle easy_installing yerine ipdb.py
Python yolunuzda bir yerde bir dosya oluşturabilir ve aşağıdakini dosyaya yapıştırabilirsiniz:
import sys
from IPython.Debugger import Pdb
from IPython.Shell import IPShell
from IPython import ipapi
shell = IPShell(argv=[''])
def set_trace():
ip = ipapi.get()
def_colors = ip.options.colors
Pdb(def_colors).set_trace(sys._getframe().f_back)
ModuleNotFoundError: No module named 'IPython.Debugger'
, ModuleNotFoundError: No module named 'IPython.Shell'
veImportError: cannot import name 'ipapi'
ModuleNotFoundError: No module named 'IPython.Debugger'
, ModuleNotFoundError: No module named 'IPython.Shell'
veImportError: cannot import name 'ipapi'
breakpoint()
ipdb içine almak için işlevini.
IPython 0.11'de, IPython'u bu şekilde doğrudan kodunuza yerleştirebilirsiniz
Programınız şöyle görünebilir
In [5]: cat > tmpf.py
a = 1
from IPython import embed
embed() # drop into an IPython session.
# Any variables you define or modify here
# will not affect program execution
c = 2
^D
Çalıştırdığınızda olan budur (keyfi olarak mevcut bir ipython oturumunda çalıştırmayı seçtim. Deneyimlerime göre ipython oturumlarını bu şekilde yerleştirmek çökmesine neden olabilir).
In [6]:
In [6]: run tmpf.py
Python 2.7.2 (default, Aug 25 2011, 00:06:33)
Type "copyright", "credits" or "license" for more information.
IPython 0.11 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: who
a embed
In [2]: a
Out[2]: 1
In [3]:
Do you really want to exit ([y]/n)? y
In [7]: who
a c embed
def f() : pass ; IPython.embed = f
böylece embed()
çağrı bir noop, sonra Ctrl + D
Eşdeğeri
import pdb; pdb.set_trace()
IPython ile şuna benzer:
from IPython.ipapi import make_session; make_session()
from IPython.Debugger import Pdb; Pdb().set_trace()
Biraz ayrıntılı, ancak ipdb'nin kurulu olup olmadığını bilmek güzel. make_session
Vs, renk düzeni kurmak için bir kez çağrı gereklidir ve set_trace
çağrılar yerleştirilebilir her yerde kırmaya gerek yoktur.
Normalde ipython kullandığımda, içindeki "pdb" komutu ile otomatik hata ayıklamayı açıyorum.
Daha sonra betiğimi, betiğimin bulunduğu dizinde "çalıştır myscript.py" komutuyla çalıştırıyorum.
Bir istisna alırsam, ipython programı hata ayıklayıcı içinde durdurur. Sihirli ipython komutları için yardım komutuna bakın (% büyü)
Bu tek satırlık yazıyı komut dosyalarıma, kesme noktası ayarlamak istediğim yere yapıştırmayı seviyorum:
__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace()
Daha yeni sürüm şunları kullanabilir:
__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()
Görünüşe göre modüller son zamanlarda biraz karıştırılmış. IPython 0.13.1'de aşağıdakiler benim için çalışıyor
from IPython.core.debugger import Tracer; breakpoint = Tracer()
breakpoint() # <= wherever you want to set the breakpoint
Ne yazık ki, qtconsole'da hepsi oldukça değersiz .
IPython'un daha yeni sürümleri, IPython oturumlarını herhangi bir Python programına yerleştirmek ve yerleştirmek için kolay bir mekanizma sağlar. IPython oturumlarını gömmek için aşağıdaki tarifi takip edebilirsiniz :
try:
get_ipython
except NameError:
banner=exit_msg=''
else:
banner = '*** Nested interpreter ***'
exit_msg = '*** Back in main IPython ***'
# First import the embed function
from IPython.frontend.terminal.embed import InteractiveShellEmbed
# Now create the IPython shell instance. Put ipshell() anywhere in your code
# where you want it to open.
ipshell = InteractiveShellEmbed(banner1=banner, exit_msg=exit_msg)
Daha sonra ipshell()
bir IPython kabuğuna bırakmak istediğinizde kullanın. Bu, kodunuza IPython yorumlayıcıları yerleştirmenize (ve hatta iç içe yerleştirmenize) izin verecektir.
Gönderen ipython docs :
import IPython.ipapi
namespace = dict(
kissa = 15,
koira = 16)
IPython.ipapi.launch_new_instance(namespace)
programlı olarak bir IPython kabuğu başlatır. Açıktır ki, namespace
diktteki değerler sadece sahte değerlerdir - locals()
pratikte kullanmak daha mantıklı olabilir .
Bunu içine sabit kodlamanız gerektiğini unutmayın; o şekilde çalışmayacak pdb
. İstediğin buysa, DoxaLogos'un cevabı muhtemelen aradığına daha çok benziyor.
Hızlı ve kolay yol:
from IPython.Debugger import Tracer
debug = Tracer()
O zaman sadece yaz
debug()
programınızda hata ayıklamaya başlamak istediğiniz yere.
ImportError: No module named 'IPython.Debugger'
python 3.4 / IPython 3
Son birkaç gündür bunu birkaç kez google'da aradım, bu yüzden bir cevap ekledim ... bazen bir komut dosyasını normal şekilde çalıştırabilmek ipdb.set_trace()
ve koda kesme noktaları koymak zorunda kalmadan yalnızca hatalarda ipython / ipdb'ye düşmek güzeldir
ipython --pdb -c "%run path/to/my/script.py --with-args here"
(ilk pip install ipython
ve pip install ipdb
tabii ki)
ipython --pdb -- ./path/to/my/script --with-args here
Bu oldukça basit:
ipython some_script.py --pdb
İPython kurulumuna ihtiyaç duyar, genellikle bu çalışır:
pip install ipython
İpython yerine ipython3 kullanıyorum, bu yüzden Python'un yeni bir sürümü olduğunu biliyorum.
Bunu hatırlamak kolaydır çünkü python yerine iPython kullanırsınız ve sonuna --pdb eklersiniz.
IPython'un REPL'i terminal renklerini kullanarak elde etmek için şunu yapmam gerekiyordu:
from IPython import start_ipython
start_ipython()
https://ipython.readthedocs.io/en/stable/api/generated/IPython.html#IPython.start_ipython