Python: Debug code with ipdb
ในการทำงานกับ Python วิธีในการ debug code มีหลายวิธีด้วยกันไม่ว่าจะเป็น
- Run editer ด้วย debug mode (เช่น วิธีการตั้งค่า Pycharm debug)
2. สั่ง print เอาเลย ในบรรทัดที่ต้องการตรวจสอบค่า เช่น
import time
print(time.asctime(), 'debugging...') # Print
Tue Dec 29 23:32:41 2020 debugging... # Output
3. ใช้ logging โดยจะ log ออกมาเป็น file เลย
import logginglogging.basicConfig(filename = 'a.log')
log = logging.getLogger()
log.error('Some error')
จะได้ไฟล์ a.log
เมื่อสั่ง cat a.log จะได้
ERROR:root:Some error
หรือเพิ่ม config เข้าไป
import logging# DEBUG, INFO, WARNING, ERROR, CRITICALlog_level = logging.INFO
logging.basicConfig(filename = 'b.log',
level=log_level,
filemode='w', # or 'a'
format='%(asctime)s %(levelname)s: %(message)s',
)log = logging.getLogger()log.info('Some info log')
log.debug("Won't print at INFO level")
จะได้ไฟล์ b.log
เมื่อสั่ง cat b.log จะได้
2020-12-29 23:41:33,582 INFO: Some info log
4. วิธีที่ผมชอบใช้อีกวิธีนึง คือ ตั้ง breakpoint ด้วย ipbd มีวิธีใช้แบบนี้นะคับ
pip install ipdb
จากนั้นเมื่อต้องการจะทำ breakpoint ที่ไหน ให้เพิ่ม code เข้าไปลักษณะนี้นะคับ
import ipdb
ipdb.set_trace()
มาดูตัวอย่างกันเลยนะคับ
ลองพิมพ์ code Python ง่ายๆเข้าไป โดยแทรก import ipdb
a = 100
import ipdb
ipdb.set_trace()
b = 50
c = a + b
ผลลัพธ์ใน console คือ โปรแกรมจะไปหยุดเหมือน breakpoint ที่บรรทัดถัดไป
ps. เราสามารถสั่ง run แบบ line by line ตั้งแต่ต้นเลย โดยให้เพิ่ม “-m ipdb” แทรกเข้าไประหว่างการรันปกติที่พิมพ์แค่ “python test_ipdb.py” นะคับ
python -m ipdb test_ipdb.py
ps: เราสามารถจัด format ของ response ที่ออกมา เพื่อให้อ่านง่ายด้วยการพิมพ์ pp
นำหน้า
หรือกด ll
เพื่อดู line ที่ ipdb อยุ่
- กรณีที่ต้องการ ipdb in the loop จะออกจาก loop ได้แบบนี้ครับ
import os; os.system('kill -9 %d' % os.getpid())
หรือ
j <25> # เป็นการ jump โดยระบุ line number ให้ออกไปนอก loop ได้เลย สะดวกมากๆ
แล้วพบกันใหม่คับ