การตั้งค่าเบรกพอยต์ด้วยตัวเลือก nosetests --pdb


88

nosetests --pdbให้ฉันหยุดเมื่อเกิดข้อผิดพลาดหรือล้มเหลว แต่มันสายเกินไปสำหรับความต้องการของฉัน การก้าวผ่านโค้ดระหว่างการดำเนินการช่วยให้ฉันแก้ไขจุดบกพร่องที่เกิดปัญหาได้

อย่างไรก็ตามการทดสอบ nosetests มีประโยชน์เนื่องจากอนุญาตการทดสอบที่อาศัยการนำเข้าแบบสัมพัทธ์ (เช่นการทดสอบในแพ็คเกจ)

ฉันจะตั้งค่าเบรกพอยต์ก่อนดำเนินการทดสอบได้อย่างไร ตอนนี้ฉันใช้:

python -m pdb /path/to/my/nosetests testfile.py

วิธีนี้ไม่เพียงพอ การทดสอบ Nosetests รบกวนเอาต์พุต pdb และการควบคุมแป้นพิมพ์ของฉัน (เช่นปุ่มลูกศร) เสีย

ใช้นำเข้า pdb; pdb.set_trace () ดูเหมือนจะเป็นความคิดที่ดีอย่างไรก็ตามการทดสอบ nosetests กำลังบล็อกการเข้าถึงคอนโซล pdb ของฉัน

คำตอบ:


120

คุณสามารถเพิ่ม

import pdb; pdb.set_trace() 

ที่ใดก็ได้ในแหล่งที่มาของคุณที่คุณต้องการหยุดในดีบักเกอร์

ให้แน่ใจว่าคุณผ่านจมูกเพื่อที่จะไม่จับ-sstdout


ฉันกำลังจะเพิ่มสิ่งนี้ในคำถามของฉัน นี่ไม่ใช่วิธีแก้ปัญหาที่ยอมรับได้เช่นกัน เมื่อใช้สิ่งนี้กับ nosetests จะเห็นได้ชัดว่าสิ่งนี้ไม่สามารถใช้งานได้อย่างแท้จริงเนื่องจากการเข้าถึงคอนโซล pdb ได้รับการคัดกรองและไม่สามารถเรียกใช้คำสั่ง pdb ได้
Devin

26
เพิ่มแฟล็ก -s ลงใน nosetests เพื่อป้องกันไม่ให้จับ stdout และคุณจะสามารถใช้ pdb ได้ดี
Ned Batchelder

1
ไม่ทำงาน, ไม่เป็นผล. ใช้สิ่งนี้:from nose.tools import set_trace; set_trace()
anilbey

144

ที่ดียิ่งไปกว่าการจดจำการใช้-sคือการใช้set_traceตัวแปรที่มาพร้อมกับจมูก เพิ่ม

from nose.tools import set_trace; set_trace()

ทุกที่ที่คุณต้องการเจาะเข้าไปในตัวแก้ไขข้อบกพร่อง การเปลี่ยนเส้นทาง stdin / out จะได้รับการดูแลสำหรับคุณ ผลข้างเคียงที่แปลกประหลาดเพียงอย่างเดียวที่ฉันพบคือไม่สามารถรีสตาร์ทรหัสของคุณจากภายใน pdb (ใช้run) ในขณะที่ทำการดีบักระหว่างการทำงานของจมูก


มีเอกสารนี้หรือไม่? จะย้ายออกจากวงได้อย่างไร?
AJ

คุณหมายถึงวิธีการนำทางเมื่อคุณpdbวิ่ง? ฉันแน่ใจว่ามีเอกสาร แต่จากส่วนบนของหัวของฉัน - s"ก้าวเข้าสู่" การเรียกฟังก์ชันnไปที่คำสั่ง "ถัดไป" uย้าย "ขึ้น" สแต็กและdเลื่อน "ลง" คุณสามารถใช้bเพื่อตั้งค่าเบรกพอยต์และc"ดำเนินการต่อ" และออกจากสเต็ปดีบั๊ก หวังว่าจะช่วยได้!
Matt Luongo

4
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ มีฟังก์ชันการทำงานปกติทั้งหมดของคำสั่ง pdb.set_trace () ดั้งเดิม
tbm

ความเป็นไปได้สำหรับเวอร์ชัน ipython / ipdb นี้หรือไม่
gerrit

5

หากคุณมีipythonสำหรับการใช้งานที่ยอดเยี่ยมไม่ จำกัด :

import ipdb; ipdb.set_trace() 

* สุดยอดไม่ จำกัด : เช่นเดียวกับ ipython - การเติมข้อความอัตโนมัติการระบายสี ฯลฯ


1

หากคุณใช้pytestคุณสามารถใช้ไฟล์

import pytest; pytest.set_trace()

โปรดดูเอกสาร

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