วิธีที่ถูกต้องในการดีบักในโน้ตบุ๊ก iPython คืออะไร?


121

ดังที่ฉันทราบ%debug magicสามารถทำการดีบักภายในเซลล์เดียว

อย่างไรก็ตามฉันมีการเรียกใช้ฟังก์ชันในหลายเซลล์

ตัวอย่างเช่น,

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

สิ่งที่ฉันพยายาม:

  1. ฉันพยายามตั้งค่า%debugในบรรทัดแรกของเซลล์ -1 แต่จะเข้าสู่โหมดดีบักทันทีก่อนที่จะเรียกใช้เซลล์ -2

  2. ผมพยายามที่จะเพิ่มในเส้นขวาก่อนรหัส%debug return do_some_thing_about(b)แต่แล้วรหัสก็ทำงานตลอดไปไม่หยุด

วิธีที่ถูกต้องในการตั้งจุดพักภายในโน้ตบุ๊ก ipython คืออะไร?

คำตอบ:


72

ใช้ipdb

ติดตั้งผ่าน

pip install ipdb

การใช้งาน:

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)

สำหรับการดำเนินการใช้งานnทีละบรรทัดและสำหรับขั้นตอนในการใช้ฟังก์ชันsและเพื่อออกจากการใช้พรอมต์การcแก้ไข

สำหรับรายการคำสั่งทั้งหมดที่มีอยู่: https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf


ipdb ไม่ให้พรอมต์การดีบักในเซลล์อื่นพร้อมรหัสตัวอย่างที่กล่าวถึงในคำถาม ตอนนี้รหัสจะทำงานตลอดไป
Rex

@Rex สำหรับฉันมันได้ผล คุณใส่ ipdb ไว้ที่ไหน ใส่ ipdb นำเข้า; ipdb.set_trace (); ก่อนบรรทัดกลับ do_some_thing_about (b) จากนั้นเรียก fun1 (a) จากเซลล์ที่สองก็ควรใช้งานได้ สำหรับการออกจาก promt การดีบักให้ใช้ 'c'
Tevin Joseph KO

@Rex อัพเดทคำตอบเพื่อความชัดเจนยิ่งขึ้น
เทวินทร์โจเซฟ KO

29
สิ่งนี้ใช้ได้ในคอนโซล iPython แต่ไม่ใช่ในโน้ตบุ๊ก iPython (ซึ่งเป็นคำถามที่ถาม) เมื่อฉันพิมพ์import ipdb; ipdb.set_trace()ภายในเซลล์สมุดบันทึกจะมีข้อความว่าMultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
บิล

1
ใหม่สำหรับ jupyter ... ดูเหมือนว่ามันจะเหมาะสำหรับการนำเสนอและแบ่งปันข้อมูลโค้ดมากกว่า ... เราสามารถมีฟังก์ชันที่ IDE (เช่น eclipse, rstudio) ให้เช่นการดีบักจริงขั้นตอนผ่านเบรกพอยต์การเพิ่มนาฬิกาให้กับนิพจน์และ ตัวแปรเป็นต้นตอนแรกดูเหมือนว่าจะไม่เป็นเช่นนั้นเพียง แต่ต้องการความแน่ใจ .....
Mahesha999

90

คุณสามารถใช้ipdbภายใน jupyter ด้วย:

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

แก้ไข : ฟังก์ชันข้างต้นเลิกใช้งานตั้งแต่ IPython 5.1 นี่คือแนวทางใหม่:

from IPython.core.debugger import set_trace

เพิ่มset_trace()จุดที่คุณต้องการจุดพัก พิมพ์helpสำหรับipdbคำสั่งเมื่อช่องใส่ปรากฏ


20
Tracerถูกหักค่าเสื่อมราคา ตอนนี้มันทำงานในลักษณะนี้: from IPython.core.debugger import set_traceและset_trace()ทำให้เกิดจุดพัก ที่มา: davidhamann.de/2017/04/22/debugging-jupyter-notebooks
Anton Tarasenko

1
สะดวกในการใช้เป็นบรรทัดเดียวทุกที่ที่ต้องการ:from IPython.core.debugger import set_trace;set_trace()
Nir

15

ฟังก์ชันการส่งคืนของคุณอยู่ในบรรทัดของฟังก์ชัน def (ฟังก์ชันหลัก) คุณต้องให้แท็บหนึ่งแท็บ และการใช้งาน

%%debug 

แทน

%debug 

เพื่อดีบักทั้งเซลล์ไม่เพียง แต่บรรทัด หวังว่านี่อาจจะช่วยคุณได้


12

คุณสามารถเพิ่มสิ่งนี้ในเซลล์ใดก็ได้:

import pdb; pdb.set_trace()

และดีบักเกอร์จะหยุดในบรรทัดนั้น ตัวอย่างเช่น:

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

In[2]: fun1(1)

ควรเป็น ipdb หรือไม่?
Rex

1
@Rex ไม่จำเป็น ipdbเป็น refactor ของ Python Debugger ที่รวมเข้ากับ IPython มากขึ้น pdbสร้างขึ้นใน
Two-Bit Alchemist

ipdbนอกจากนี้ยังสามารถใช้ภายนอกเปลือก ipython และมาพร้อมกับสิ่งอำนวยความสะดวกบางอย่างเช่นการเติมแท็บ
ม.ค.

12

ใน Python 3.7 คุณสามารถใช้ฟังก์ชันเบรกพอยต์ () เพียงแค่ใส่

breakpoint()

ทุกที่ที่คุณต้องการให้รันไทม์หยุดและจากที่นั่นคุณสามารถใช้คำสั่ง pdb เดียวกัน (r, c, n, ... ) หรือประเมินตัวแปรของคุณ


2
หากต้องการเพิ่มสิ่งนี้เมื่อคุณเรียกเบรกพอยต์ () คุณสามารถพิมพ์ 'help' ในกล่องข้อความที่ปรากฏขึ้นเพื่อรับรายการคำสั่ง
gbeaven

ดูเหมือนว่าจะมีปัญหาอย่างต่อเนื่องของการวางสายหลังจากใช้เบรกพอยต์ () หรือ pdb: github.com/ipython/ipython/issues/10516
Dave Liu

8

เพียงพิมพ์import pdbjupyter notebook จากนั้นใช้cheatsheetนี้เพื่อแก้จุดบกพร่อง มันสะดวกมาก

c-> ดำเนินการต่อs-> ขั้นตอนb 12-> กำหนดจุดพักที่บรรทัดที่ 12 และอื่น ๆ

ลิงก์ที่มีประโยชน์บางส่วน: เอกสารอย่างเป็นทางการของ Python บน pdb , ตัวอย่างโปรแกรมดีบัก Python pdb เพื่อให้เข้าใจวิธีใช้คำสั่งดีบักเกอร์ได้ดีขึ้น

ภาพหน้าจอที่มีประโยชน์: ใส่คำอธิบายภาพที่นี่ใส่คำอธิบายภาพที่นี่


คำตอบที่ดี. อย่างไรก็ตามฉันคิดว่า (ฉันยังใหม่กับสมุดบันทึก Jupyter) ควรเพิ่ม% debug เพื่อตั้งค่าเบรกพอยต์
Ad Infinitum

สิ่งที่ฉันทำคือคัดลอกและวางpdb.set_trace()ในตำแหน่งที่ฉันต้องการตั้งเบรกพอยต์เนื่องจากb line_noไม่ทำงานใน Jupyter Notebook และทำงานได้ดีกับ python IDLE
flowera

ขอบคุณ! ฉันยังอัปโหลดภาพหน้าจอที่ฉันทดสอบในวันนี้ด้วย ถ้าฉันสามารถเปลี่ยนไปใช้ Python IDLE ได้ฉันก็ชอบที่จะทำเช่นนั้น ..
flowera

นอกจากนี้ฉันพบวิธีแสดงหมายเลขบรรทัดบนสมุดบันทึก jupyter คลิกบรรทัดใหม่แล้วกด l แน่นอนว่าคุณสามารถตั้งโปรแกรมช็อตคัทของคุณเองได้ลิงก์มีอยู่ในเว็บไซต์สมุดบันทึก jupyter
flowera

1
ฉันใช้ "p" เสมอเพื่อแสดงรายการคำสั่งในสมุดบันทึก Jupyter เมื่อฉันเขียน "แสดงหมายเลขบรรทัด" คำสั่งจะปรากฏขึ้นพร้อมกับทางลัดที่อยู่ข้างๆ คุณยังสามารถเรียนรู้ทางลัดของคำสั่งที่คุณต้องการใช้
Ad Infinitum

8

หลังจากคุณได้รับข้อผิดพลาดในเซลล์ถัดไปให้เรียกใช้%debugเท่านี้


1
มันสุดยอดมาก!
คน

อย่างไรก็ตามต้องรอให้มีข้อยกเว้นเกิดขึ้นเราอาจต้องการทดสอบว่าตัวแปรในรันไทม์คืออะไรโดยตั้งค่าเบรกพอยต์
Luk Aron

7

%pdbคำสั่งมายากลเป็นสิ่งที่ดีที่จะใช้เป็นอย่างดี เพียงแค่พูด%pdb onแล้วpdbดีบักเกอร์จะทำงานบนข้อยกเว้นทั้งหมดไม่ว่าจะอยู่ลึกแค่ไหนใน call stack ก็ตาม มีประโยชน์มาก

หากคุณมีบรรทัดเฉพาะที่คุณต้องการแก้ไขจุดบกพร่องเพียงแค่ยกข้อยกเว้นตรงนั้น (มักจะเป็นอยู่แล้ว!) หรือใช้%debugคำสั่งเวทย์มนตร์ที่คนอื่นแนะนำ


5

ฉันเพิ่งค้นพบPixieDebugger แม้จะคิดว่าฉันยังไม่มีเวลาทดสอบดูเหมือนว่าจะเป็นวิธีที่คล้ายกันที่สุดในการดีบักวิธีที่เราใช้ใน ipython กับ ipdb

ใส่คำอธิบายภาพที่นี่

นอกจากนี้ยังมีแท็บ "ประเมิน"


0

มีการทำให้ดีบักเกอร์เนทีฟเป็นส่วนขยายของ JupyterLab เปิดตัวเมื่อไม่กี่สัปดาห์ก่อนสามารถติดตั้งได้โดยรับส่วนขยายที่เกี่ยวข้องเช่นเดียวกับเคอร์เนล xeus-python (ซึ่งโดยเฉพาะอย่างยิ่งมาโดยไม่ต้องใช้เวทมนตร์ที่ผู้ใช้ ipykernel รู้จักกันดี):

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

สิ่งนี้ทำให้ประสบการณ์การดีบักภาพเป็นที่รู้จักกันดีจาก IDEs อื่น ๆ

ใส่คำอธิบายภาพที่นี่

ที่มา: วิชวลดีบักเกอร์สำหรับ Jupyter


xeus-python ไม่ทำงานบน Windows 10 ของฉันตรวจสอบปัญหาxeus-python
sergzemsk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.