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


Đối với các nhu cầu gỡ lỗi của tôi, pdb là khá tốt. Tuy nhiên, nó sẽ là nhiều mát hơn (và hữu ích) nếu tôi có thể đi vào ipython. Có phải điều này có thể?


76
2017-07-14 17:45


gốc




Các câu trả lời:


Đây là một ipdb dự án nhúng iPython vào pdb chuẩn, vì vậy bạn có thể thực hiện:

import ipdb; ipdb.set_trace()

Có thể cài đặt thông qua thông thường pip install ipdb.

ipdb là 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 bạn 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)

106
2017-07-14 18:18



Tuyệt vời! Điều này thật tuyệt! - Geo
Hoạt động rất tốt với Django. Vâng, ngoại trừ thực tế là tôi không thể nhìn thấy văn bản tôi đang gõ, nhưng đó có thể dễ dàng sửa chữa (kể từ khi chỉ có sáu dòng của ipdb). - Xiong Chiamiov
Trên thực tế, vấn đề ở đó là Django dồn một sợi riêng biệt cho máy chủ lưu trữ, và bất cứ khi nào bạn thực hiện chỉnh sửa mã, nó sẽ lặp lại luồng. Điều này thường hoạt động tốt, nhưng nếu bạn đang ngồi trong pdb khi thread bị giết, các thiết bị đầu cuối đi điên. Bạn có thể sửa lỗi này bằng cách thoát khỏi máy chủ, runniny 'stty sane', sau đó khởi động lại máy chủ. - Jeremy Dunck
@ daniel-roseman Xin chào, tôi nhận được ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell' và ImportError: cannot import name 'ipapi' - SebMa
@memoselyk Xin chào, tôi nhận được ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell' và ImportError: cannot import name 'ipapi' - SebMa


Trong IPython 0,11, bạn có thể nhúng trực tiếp IPython vào mã của bạn như thế này

Chương trình của bạn có thể trông giố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ì xảy ra khi bạn chạy nó (tôi tự ý chọn để chạy nó bên trong một phiên ipython hiện có. Các phiên làm việc ipython lồng nhau như thế này trong kinh nghiệm của tôi có thể làm cho nó sụp đổ).

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

49
2017-09-14 05:00



Điều này rơi vào một phiên IPython là rất mát mẻ. Cảm ơn bạn rất nhiều! - joon
Tôi ngu xuẩn đặt cái này vào trong một vòng lặp (gần như vô hạn). Làm thế nào tôi có thể nhận ra? - gerrit
@gerrit, nhấn Ctrl + d nếu bạn vẫn còn ở đó. - confused00
@ confused00 Điều đó sẽ có được vô cùng mạnh mẽ, 6 tháng sau ;-) - gerrit
Một lợi thế này đã qua pdb và ipdb là bất kỳ ngoại lệ nào được gây ra bởi mã bạn chạy đều nhận được các dấu vết đầy đủ (vì bạn chưa phải là "trong"). Điều này cực kỳ hữu ích đối với tôi, vì tôi có xu hướng sử dụng pdb như một cách để thiết lập một loạt các biến cho một trình bao tương tác. - Xiong Chiamiov


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()

Đó là một chút tiết, nhưng tốt để biết nếu bạn không có cài đặt ipdb. Các make_session cuộc gọi được yêu cầu một lần để thiết lập bảng màu, v.v. set_trace các cuộc gọi có thể được đặt bất cứ nơi nào bạn cần để phá vỡ.


11
2017-07-15 00:40





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 cái gì đó 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
2017-09-21 10:41





Thông thường, khi tôi sử dụng ipython, tôi bật tự động gỡ lỗi với lệnh "pdb" bên trong nó.

Sau đó, tôi chạy tập lệnh của mình bằng lệnh "chạy myscript.py" trong thư mục có tập lệnh của tôi.

Nếu tôi nhận được một ngoại lệ, ipython sẽ dừng chương trình bên trong trình gỡ rối. Kiểm tra lệnh trợ giúp cho các lệnh ipython ma thuật (% magic)


8
2017-07-14 18:08



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


Tôi chỉ đơn giản dán một lớp lót này vào các kịch bản của tôi, 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()

8
2017-08-29 11:58





Có vẻ như các mô-đun đã được xáo trộn gần đây một chút. Trên IPython 0.13.1 sau đây làm việc cho 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 đẹp vô giá trị trong qtconsole.


6
2018-01-22 17:43





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ể đi theo tui 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 vỏ IPython. Điều này sẽ cho phép bạn nhúng (và thậm chí làm tổ) các trình thông dịch IPython trong mã của bạn.


4
2018-03-27 17:22