Có thể đi vào ipython từ mã không?


81

Đối với nhu cầu gỡ lỗi của tôi, pdblà 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:


112

Có một ipdbdự á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.

ipdbkhá 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)

Hoạt động tốt một cách đáng kinh ngạc với Django. Chà, ngoại trừ thực tế là tôi không thể nhìn thấy văn bản tôi đang nhập, nhưng điều đó có thể dễ dàng sửa chữa (vì ipdb chỉ có sáu dòng).
Xiong Chiamiov

4
Trên thực tế, vấn đề ở đó là Django tạo một chuỗi riêng cho máy chủ chạy và bất kỳ khi nào bạn thực hiện chỉnh sửa mã, nó sẽ khởi động lại chuỗi đó. Điều này thường hoạt động tốt, nhưng nếu bạn đang ngồi trong pdb khi luồng bị giết, thiết bị đầu cuối sẽ mất trí. Bạn có thể khắc phục điều này bằng cách thoát khỏi máy chạy bộ, chạy 'stty sane', sau đó khởi động lại máy chủ chạy.
Jeremy Dunck,

1
@ daniel-roseman Xin chào, tôi hiểu ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell'ImportError: cannot import name 'ipapi'
SebMa

1
@memoselyk Xin chào, tôi hiểu ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell'ImportError: cannot import name 'ipapi'
SebMa

Có một cách để lấy breakpoint()hàm vào ipdb.
gerrit 12/1218

53

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

Điều này rơi vào một phiên IPython là rất tuyệt. Cảm ơn bạn rất nhiều!
joon

1
Tôi đã đặt nó một cách ngu ngốc bên trong một vòng lặp (gần như vô hạn). Làm sao tôi có thể thoát ra được?
gerrit

2
@gerrit, nhấn Ctrl + d nếu bạn vẫn ở đó.
bối rối.

2
@ confused00 Điều đó đã được mãnh liệt vô hạn, 6 tháng sau ;-)
Gerrit

1
@gerrit, Nếu bạn đang mắc kẹt trong một vòng lặp nhúng: def f() : pass ; IPython.embed = fđể các embed()cuộc gọi là một noop, sau đó Ctrl + D
MatrixManAtYrService

12

Nếu bạn đang sử dụng phiên bản hiện đại hơn của IPython (> 0.10.2), bạn có thể sử dụng một số thứ như

from IPython.core.debugger import Pdb
Pdb().set_trace()

Nhưng có lẽ tốt hơn là chỉ sử dụng ipdb


11

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_sessiongọi được yêu cầu một lần để thiết lập bảng màu, v.v. và set_tracecuộc gọi có thể được thực hiện ở bất cứ đâu bạn cần ngắt.


8

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)


vì vậy không có cách nào để viết một cái gì đó như ipython.set_trace ()? :)
Geo

8

Tôi chỉ muốn dán một lớp lót này vào các tập lệnh của mình nơi tôi muốn đặt điểm ngắt:

__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace()

Phiên bản mới hơn có thể sử dụng:

__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()

6

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 .


5

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.


3

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 namespacedict 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 pdbhiệ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.


3

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.


1
ImportError: No module named 'IPython.Debugger'trên python 3.4 / IPython 3
ostrokach

2

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 ipythonpip install ipdbtất nhiên)


1
Cảm ơn bạn! ipython --pdb -- ./path/to/my/script --with-args here
Đơn

0

Đ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.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.