Cách phù hợp để gỡ lỗi trong sổ ghi chép iPython là gì?


121

Như tôi biết, %debug magiccó thể gỡ lỗi trong một ô.

Tuy nhiên, tôi có các lệnh gọi hàm trên nhiều ô.

Ví dụ,

In[1]: def fun1(a)
           def fun2(b)
               # I want to set a breakpoint for the following line #
               return do_some_thing_about(b)

       return fun2(a)

In[2]: import multiprocessing as mp
       pool=mp.Pool(processes=2)
       results=pool.map(fun1, 1.0)
       pool.close()
       pool.join

Những gì tôi đã thử:

  1. Tôi đã cố gắng đặt %debugở dòng đầu tiên của ô-1. Nhưng nó vào chế độ gỡ lỗi ngay lập tức, ngay cả trước khi thực thi ô-2.

  2. Tôi đã cố gắng thêm %debugvào dòng ngay trước mã return do_some_thing_about(b). Nhưng sau đó mã chạy mãi mãi, không bao giờ dừng lại.

Cách phù hợp để thiết lập điểm ngắt trong sổ ghi chép ipython là gì?

Câu trả lời:


72

Sử dụng ipdb

Cài đặt nó qua

pip install ipdb

Sử dụng:

In[1]: def fun1(a):
   def fun2(a):
       import ipdb; ipdb.set_trace() # debugging starts here
       return do_some_thing_about(b)
   return fun2(a)
In[2]: fun1(1)

Để thực hiện sử dụng ntừng dòng và sử dụng bước vào một hàm svà thoát khỏi sử dụng nhắc gỡ lỗi c.

Để có danh sách đầy đủ các lệnh có sẵn: https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf


ipdb không cung cấp cho tôi lời nhắc gỡ lỗi trong ô khác có mã mẫu được đề cập trong câu hỏi. Bây giờ mã tiếp tục chạy mãi mãi.
Rex

@Rex Đối với tôi, nó hoạt động. Bạn đã đặt ipdb ở đâu? Đặt ipdb nhập khẩu; ipdb.set_trace (); trước khi dòng trả về do_some_thing_about (b). Sau đó, gọi fun1 (a) từ ô thứ hai, nó sẽ hoạt động. Để thoát khỏi chương trình gỡ lỗi, hãy sử dụng 'c'
Tevin Joseph KO

@Rex Đã cập nhật câu trả lời để rõ ràng hơn.
Tevin Joseph KO

29
Điều này hoạt động trong bảng điều khiển iPython nhưng không hoạt động trong máy tính xách tay iPython (đó là những gì câu hỏi được đặt ra). Khi tôi nhập import ipdb; ipdb.set_trace()trong một ô sổ ghi chép, nó nóiMultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
Bill

1
mới đối với jupyter ... có vẻ như nó phù hợp hơn để trình bày và chia sẻ đoạn mã ... chúng ta có thể có chức năng mà IDE (như eclipse, rstudio) cung cấp như gỡ lỗi thực tế, từng bước, điểm ngắt, thêm đồng hồ vào biểu thức và biến vv lúc đầu, có vẻ như nó không phải là trường hợp, chỉ muốn chắc chắn .....
Mahesha999

90

Bạn có thể sử dụng ipdbbên trong jupyter với:

from IPython.core.debugger import Tracer; Tracer()()

Chỉnh sửa : các chức năng trên không được dùng nữa kể từ IPython 5.1. Đây là cách tiếp cận mới:

from IPython.core.debugger import set_trace

Thêm vào set_trace()nơi bạn cần một điểm ngắt. Gõ helpcho ipdblệnh khi trường nhập xuất hiện.


20
Tracerđã được khấu hao. Bây giờ nó hoạt động theo cách này: from IPython.core.debugger import set_traceset_trace()gợi lên một điểm ngắt. Nguồn: davidhamann.de/2017/04/22/debugging-jupyter-notebooks
Anton Tarasenko

1
Tiện dụng để sử dụng như một dòng, bất cứ khi nào cần thiết:from IPython.core.debugger import set_trace;set_trace()
Nir

15

Hàm trả về của bạn nằm trong dòng của hàm def (hàm chính), bạn phải cung cấp một tab cho nó. Và sử dụng

%%debug 

thay vì

%debug 

để gỡ lỗi toàn bộ ô không chỉ dòng. Hy vọng, có thể điều này sẽ giúp bạn.


12

Bạn luôn có thể thêm điều này vào bất kỳ ô nào:

import pdb; pdb.set_trace()

và trình gỡ lỗi sẽ dừng trên dòng đó. Ví dụ:

In[1]: def fun1(a):
           def fun2(a):
               import pdb; pdb.set_trace() # debugging starts here
           return fun2(a)

In[2]: fun1(1)

Đó có nên là ipdb không?
Rex

1
@Rex Không nhất thiết. ipdblà một cơ cấu lại của Trình gỡ lỗi Python được tích hợp chặt chẽ hơn với IPython. pdbđược tích hợp sẵn.
Two-Bit Alchemist

ipdbcũng có thể được sử dụng bên ngoài ipython shell và đi kèm với một số tiện ích như hoàn thành tab.
Jan

12

Trong Python 3.7, bạn có thể sử dụng hàm breakpoint () . Chỉ cần nhập

breakpoint()

bất cứ nơi nào bạn muốn thời gian chạy dừng lại và từ đó bạn có thể sử dụng các lệnh pdb tương tự (r, c, n, ...) hoặc đánh giá các biến của bạn.


2
Để thêm vào điều này, khi bạn gọi breakpoint (), bạn có thể nhập 'help' vào hộp văn bản xuất hiện để nhận danh sách lệnh.
gbeaven

Dường như có một vấn đề dai dẳng của hang-up sau khi sử dụng breakpoint () hoặc pdb: github.com/ipython/ipython/issues/10516
Dave Liu

8

Chỉ cần nhập import pdbsổ ghi chép jupyter, sau đó sử dụng bảng cheats này để gỡ lỗi. Nó rất tiện lợi.

c-> tiếp tục, s-> bước, b 12-> đặt điểm ngắt tại dòng 12, v.v.

Một số liên kết hữu ích: Tài liệu chính thức của Python về pdb , Ví dụ về trình gỡ lỗi pdb của Python để hiểu rõ hơn về cách sử dụng các lệnh của trình gỡ lỗi .

Một số ảnh chụp màn hình hữu ích: nhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đây


Câu trả lời tốt. Tuy nhiên, tôi nghĩ (tôi mới sử dụng máy tính xách tay Jupyter) người ta nên thêm% debug để thiết lập điểm ngắt.
Ad Infinitum

Những gì tôi làm là sao chép và dán pdb.set_trace()vào nơi tôi muốn đặt điểm ngắt, vì điểm ngắt b line_nokhông hoạt động trong Jupyter Notebook và hoạt động tốt trên python IDLE.
flowera

Cảm ơn! Tôi cũng đã tải lên một số ảnh chụp màn hình mà tôi đã thử nghiệm ngày hôm nay. Nếu tôi có thể chuyển sang Python IDLE Tôi rất thích làm như vậy ..
flowera

Ngoài ra, tôi tìm thấy một cách để hiển thị số dòng trên sổ ghi chép jupyter, nhấp vào dòng mới, rồi nhấn l.Tất nhiên bạn cũng có thể lập trình phím tắt của riêng mình, các liên kết có sẵn trên trang web sổ ghi chép jupyter.
flowera

1
Tôi luôn sử dụng "p" để hiển thị danh sách các lệnh trong sổ ghi chép Jupyter. Khi tôi viết "hiển thị số dòng", lệnh sẽ xuất hiện ở đó với phím tắt bên cạnh. Bạn cũng có thể tìm hiểu phím tắt của lệnh mà bạn muốn sử dụng.
Ad Infinitum

8

Sau khi bạn gặp lỗi, trong ô tiếp theo chỉ cần chạy %debugvà thế là xong.


1
điều đó thật tuyệt vời!
Ai đó

tuy nhiên, điều này phải đợi ngoại lệ xảy ra, chúng tôi có thể muốn kiểm tra biến là gì trong thời gian chạy bằng cách đặt một số điểm ngắt
Luk Aron

7

Lệnh %pdbma thuật cũng tốt để sử dụng. Chỉ cần nói %pdb onvà sau đó pdbtrình gỡ lỗi sẽ chạy trên tất cả các ngoại lệ, bất kể sâu bao nhiêu trong ngăn xếp cuộc gọi. Rất tiện dụng.

Nếu bạn có một dòng cụ thể mà bạn muốn gỡ lỗi, chỉ cần nêu ra một ngoại lệ ở đó (thường là bạn đã có!) Hoặc sử dụng %debuglệnh ma thuật mà những người khác đã đề xuất.


5

Tôi vừa phát hiện ra PixieDebugger . Ngay cả khi tôi nghĩ rằng tôi chưa có thời gian để kiểm tra nó, nó thực sự có vẻ là cách tương tự nhất để gỡ lỗi với cách chúng tôi sử dụng trong ipython với ipdb

nhập mô tả hình ảnh ở đây

Nó cũng có một tab "đánh giá"


0

Trình gỡ lỗi gốc đang được cung cấp dưới dạng tiện ích mở rộng cho JupyterLab. Được phát hành vài tuần trước, điều này có thể được cài đặt bằng cách tải tiện ích mở rộng có liên quan, cũng như nhân xeus-python (đặc biệt là không có phép thuật mà người dùng ipykernel nổi tiếng):

jupyter labextension install @jupyterlab/debugger
conda install xeus-python -c conda-forge

Điều này cho phép trải nghiệm gỡ lỗi trực quan nổi tiếng từ các IDE khác.

nhập mô tả hình ảnh ở đây

Nguồn: Trình gỡ lỗi trực quan cho Jupyter


xeus-python không chạy trên Windows 10. Hãy kiểm tra sự cố xeus-python
sergzemsk
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.