Đối với nhu cầu gỡ lỗi của tôi, pdb
là khá tốt. Tuy nhiên, sẽ tuyệt hơn nhiều (và hữu ích) nếu tôi có thể đi vào ipython
. Điều này là có thể?
Câu trả lời:
Có một ipdb
dự án nhúng iPython vào pdb tiêu chuẩn, vì vậy bạn chỉ cần làm:
import ipdb; ipdb.set_trace()
Nó có thể cài đặt thông thường pip install ipdb
.
ipdb
khá ngắn, vì vậy thay vì easy_installing, bạn cũng có thể tạo một tệp ipdb.py
ở đâu đó trên đường dẫn Python của mình và dán phần sau vào tệp:
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'
vàImportError: cannot import name 'ipapi'
ModuleNotFoundError: No module named 'IPython.Debugger'
, ModuleNotFoundError: No module named 'IPython.Shell'
vàImportError: cannot import name 'ipapi'
breakpoint()
hàm vào ipdb.
Trong IPython 0.11, bạn có thể nhúng IPython trực tiếp vào mã của mình như thế này
Chương trình của bạn có thể trông như thế này
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
Đây là những gì sẽ xảy ra khi bạn chạy nó (Tôi đã tự ý chọn chạy nó trong một phiên ipython hiện có. Việc lồng các phiên ipython như thế này theo kinh nghiệm của tôi có thể khiến nó gặp sự cố).
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
để các embed()
cuộc gọi là một noop, sau đó Ctrl + D
Tương đương với
import pdb; pdb.set_trace()
với IPython là một cái gì đó như:
from IPython.ipapi import make_session; make_session()
from IPython.Debugger import Pdb; Pdb().set_trace()
Nó hơi dài dòng, nhưng tốt nếu bạn chưa cài đặt ipdb. Cuộc make_session
gọi được yêu cầu một lần để thiết lập bảng màu, v.v. và set_trace
cuộc gọi có thể được thực hiện ở bất cứ đâu bạn cần ngắt.
Thông thường, khi tôi sử dụng ipython, tôi bật gỡ lỗi tự động bằng lệnh "pdb" bên trong nó.
Sau đó, tôi chạy tập lệnh của mình bằng lệnh "run myscript.py" trong thư mục chứa tập lệnh của tôi.
Nếu tôi gặp một ngoại lệ, ipython sẽ dừng chương trình bên trong trình gỡ lỗi. Kiểm tra lệnh trợ giúp cho các lệnh ipython ma thuật (% ma thuật)
Có vẻ như các mô-đun đã bị xáo trộn một chút gần đây. Trên IPython 0.13.1, những điều sau đây phù hợp với tôi
from IPython.core.debugger import Tracer; breakpoint = Tracer()
breakpoint() # <= wherever you want to set the breakpoint
Mặc dù than ôi, tất cả đều khá vô giá trị trong qtconsole .
Các phiên bản mới hơn của IPython cung cấp một cơ chế dễ dàng để nhúng và lồng các phiên IPython vào bất kỳ chương trình Python nào. Bạn có thể làm theo công thức sau để nhúng các phiên IPython:
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)
Sau đó, sử dụng ipshell()
bất cứ khi nào bạn muốn thả vào một trình bao IPython. Điều này sẽ cho phép bạn nhúng (và thậm chí lồng) các trình thông dịch IPython vào mã của bạn.
Từ tài liệu IPython :
import IPython.ipapi
namespace = dict(
kissa = 15,
koira = 16)
IPython.ipapi.launch_new_instance(namespace)
sẽ khởi chạy trình bao IPython theo lập trình. Rõ ràng các giá trị trong namespace
dict chỉ là giá trị giả - nó có thể hợp lý hơn khi sử dụnglocals()
trong thực tế.
Lưu ý rằng bạn phải viết mã này trong; nó sẽ không hoạt động theo cách pdb
hiện tại. Nếu đó là những gì bạn muốn, câu trả lời của DoxaLogos có lẽ giống với những gì bạn đang tìm kiếm hơn.
Cách nhanh chóng và dễ dàng:
from IPython.Debugger import Tracer
debug = Tracer()
Sau đó chỉ cần viết
debug()
bất cứ nơi nào bạn muốn bắt đầu gỡ lỗi chương trình của bạn.
ImportError: No module named 'IPython.Debugger'
trên python 3.4 / IPython 3
Tôi đã phải google cái này một vài lần trong vài ngày qua để thêm câu trả lời ... đôi khi thật tuyệt khi có thể chạy một tập lệnh bình thường và chỉ rơi vào ipython / ipdb khi có lỗi, mà không cần phải đặt các ipdb.set_trace()
điểm ngắt vào mã
ipython --pdb -c "%run path/to/my/script.py --with-args here"
(Đầu tiên pip install ipython
và pip install ipdb
tất nhiên)
ipython --pdb -- ./path/to/my/script --with-args here
Điều này khá đơn giản:
ipython some_script.py --pdb
Nó cần cài đặt iPython, thông thường điều này hoạt động:
pip install ipython
Tôi sử dụng ipython3 thay vì ipython, vì vậy tôi biết đó là phiên bản Python gần đây.
Điều này rất dễ nhớ vì bạn chỉ sử dụng iPython thay vì python và thêm --pdb vào cuối.
Để có được REPL của IPython bằng cách sử dụng các màu đầu cuối, tôi phải làm như sau:
from IPython import start_ipython
start_ipython()
https://ipython.readthedocs.io/en/stable/api/generated/IPython.html#IPython.start_ipython