ใน Java / C # คุณสามารถทีละขั้นตอนรหัสเพื่อติดตามสิ่งที่อาจจะผิดพลาดและ IDE ทำให้กระบวนการนี้เป็นมิตรต่อผู้ใช้
คุณสามารถติดตามรหัสไพ ธ อนในลักษณะที่คล้ายกันได้หรือไม่?
ใน Java / C # คุณสามารถทีละขั้นตอนรหัสเพื่อติดตามสิ่งที่อาจจะผิดพลาดและ IDE ทำให้กระบวนการนี้เป็นมิตรต่อผู้ใช้
คุณสามารถติดตามรหัสไพ ธ อนในลักษณะที่คล้ายกันได้หรือไม่?
คำตอบ:
ใช่ มีโปรแกรมดีบัก Python pdb
สำหรับการทำสิ่งนั้น!
คุณสามารถเปิดโปรแกรมหลามผ่านpdb
โดยใช้หรือpdb myscript.py
python -m pdb myscript.py
มีคำสั่งไม่กี่คำที่คุณสามารถออกได้ซึ่งมีเอกสารอยู่ในpdb
หน้านั้น
สิ่งที่มีประโยชน์ที่ควรจำคือ:
b
: ตั้งค่าเบรกพอยต์c
: ทำการดีบักต่อไปจนกว่าคุณจะถึงจุดพักs
: ก้าวผ่านรหัสn
: เพื่อไปที่บรรทัดถัดไปของรหัสl
: ลิสต์ซอร์สโค้ดสำหรับไฟล์ปัจจุบัน (ค่าเริ่มต้น: 11 บรรทัดรวมถึงบรรทัดที่กำลังดำเนินการ)u
: นำทางขึ้นกรอบสแต็คd
: เลื่อนเฟรมสแต็กลงp
: เพื่อพิมพ์ค่าของนิพจน์ในบริบทปัจจุบันหากคุณไม่ต้องการใช้ดีบักเกอร์บรรทัดคำสั่ง IDE บางตัวเช่นPydev , Wing IDEหรือPyCharmจะมีตัวดีบัก GUI Wing และ PyCharm เป็นผลิตภัณฑ์เชิงพาณิชย์ แต่ Wing มีรุ่น "ส่วนตัว" ฟรีและ PyCharm มีรุ่นชุมชนฟรี
pudb
เหมาะสำหรับสิ่งนั้น นอกจากนี้pydev
pdb
ไม่ใช่เครื่องมือบรรทัดคำสั่ง python -m pdb your_script.py
ที่จะใช้มันใช้
pdb
คำสั่งเป็นส่วนหนึ่งของpython
แพ็คเกจ ไม่ว่าในกรณีใดการpython -m <module>
กลายเป็นมาตรฐานสำหรับสิ่งอื่น ๆ เช่นpip
กันดังนั้นจึงควรใช้สิ่งนั้นเป็นค่าเริ่มต้น
ขั้นตอนแรกคือการทำให้ Python interpreter เข้าสู่โหมดแก้ไขข้อบกพร่อง
A. จากบรรทัดคำสั่ง
ทางตรงส่วนใหญ่วิ่งจากบรรทัดคำสั่งของล่ามหลาม
$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)
B. ภายในล่าม
ในขณะที่การพัฒนาโมดูลรุ่นแรก ๆ และเพื่อทดสอบมันซ้ำ ๆ
$ python
Python 2.7 (r27:82508, Jul 3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)
C. จากภายในโปรแกรมของคุณ
สำหรับโครงการขนาดใหญ่และโมดูลที่ใช้เวลานานสามารถเริ่มการดีบักจากภายในโปรแกรมโดยใช้ import pdbและset_trace () ดังนี้:
#!/usr/bin/env python
# encoding: utf-8
#
import pdb
class MyObj(object):
count = 5
def __init__(self):
self.count= 9
def go(self):
for i in range(self.count):
pdb.set_trace()
print i
return
if __name__ == '__main__':
MyObj(5).go()
การดีบักแบบทีละขั้นตอนเพื่อเข้าสู่ภายในมากขึ้น
ดำเนินการคำสั่งถัดไป…ด้วย“ n” (ถัดไป)
ทำซ้ำคำสั่งการดีบักครั้งล่าสุด ... ด้วยENTER
เลิกทั้งหมด ... ด้วย“ q” (ออกจาก)
การพิมพ์ค่าของตัวแปร ... ด้วย“ p” (พิมพ์)
ก) ต่อปี
การปิดพรอมต์ (Pdb) ... ด้วย“ c” (ดำเนินการต่อ)
ดูว่าคุณอยู่ที่ไหน…ด้วย“ l” (รายการ)
ก้าวเข้าสู่รูทีนย่อย ... ด้วย“ s” (เข้าสู่)
ดำเนินการต่อ ... แต่ต่อท้ายรูทีนย่อยปัจจุบัน ... ด้วย“ r” (return)
กำหนดค่าใหม่
a) ! b = "B"
ตั้งค่าเบรกพอยต์
a) ทำลายผ้าลินิน
b) แบ่งชื่อฟังก์ชั่น
c) แบ่งชื่อไฟล์: linenumber
จุดพักชั่วคราว
a) ผ้าลินิน tbreak
เบรกพอยต์แบบมีเงื่อนไข
a) ทำลายชุดเครื่องนอน
หมายเหตุ: ** คำสั่งเหล่านี้ควรถูกเรียกใช้จาก ** pdb
สำหรับความรู้ในเชิงลึกดู: -
https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/
มีโมดูลที่เรียกว่า 'pdb' ใน python ที่ด้านบนสุดของสคริปต์ไพ ธ อนของคุณ
import pdb
pdb.set_trace()
และคุณจะเข้าสู่โหมดแก้ไขข้อบกพร่อง คุณสามารถใช้ 'ถึง' ขั้นตอน 'n' เพื่อติดตามบรรทัดถัดไปคล้ายกับสิ่งที่คุณจะทำกับดีบักเกอร์ 'gdb'
การเริ่มต้นใน Python 3.7 คุณสามารถใช้breakpoint()
ฟังก์ชันในตัวเพื่อเข้าสู่การดีบักเกอร์:
foo()
breakpoint() # drop into the debugger at this point
bar()
โดยค่าเริ่มต้นbreakpoint()
จะนำเข้าและโทรpdb
pdb.set_trace()
อย่างไรก็ตามคุณสามารถควบคุมพฤติกรรมการแก้จุดบกพร่องผ่านและการใช้ตัวแปรสภาพแวดล้อมsys.breakpointhook()
PYTHONBREAKPOINT
ดูPEP 553สำหรับข้อมูลเพิ่มเติม
breakpoint
ฉันรู้สึกตื่นเต้น แต่จากนั้นฉันได้เรียนรู้ว่ามันเป็นเพียงทางลัดimport pdb; pdb.set_trace()
และทำให้ฉันเศร้า Python devs: โปรดเน้นที่การปรับปรุง PDB ด้วยคุณสมบัติ GDB พื้นฐานเช่นบรรทัดบริบทประวัติคำสั่งถาวรและการ
ipdbเพิ่มฟังก์ชันการทำงานของ IPython ให้กับ pdb โดยเสนอการปรับปรุงอย่างมากดังต่อไปนี้:
เช่นเดียวกับ pdg, ipdb ยังห่างไกลจากความสมบูรณ์แบบและพื้นฐานอย่างสมบูรณ์หากเทียบกับ GDB แต่มันมีการปรับปรุงมากกว่า pdb อย่างมาก
การใช้งานคล้ายกับpdb
เพียงแค่ติดตั้งด้วย:
python3 -m pip install --user ipdb
จากนั้นเพิ่มในบรรทัดที่คุณต้องการแก้ปัญหาขั้นตอนจาก:
__import__('ipdb').set_trace(context=21)
คุณอาจต้องการเพิ่มทางลัดสำหรับสิ่งนั้นจากโปรแกรมแก้ไขของคุณเช่นสำหรับVim snipmate ที่ฉันมี:
snippet ipd
__import__('ipdb').set_trace(context=21)
ดังนั้นฉันสามารถพิมพ์เพียงipd<tab>
และมันขยายไปถึงจุดพัก จากนั้นการลบทำได้ง่ายdd
เนื่องจากมีทุกสิ่งอยู่ในบรรทัดเดียว
context=21
เพิ่มจำนวนบรรทัดบริบทตามที่อธิบายไว้ที่: ฉันจะทำให้ ipdb แสดงบรรทัดบริบทมากขึ้นขณะทำการดีบักได้อย่างไร
หรือคุณสามารถดีบักโปรแกรมได้ตั้งแต่เริ่มต้นด้วย:
ipdb3 main.py
แต่โดยทั่วไปคุณไม่ต้องการทำเช่นนั้นเพราะ:
หรืออีกทางหนึ่งเช่นเดียวกับ raw pdb 3.2+ คุณสามารถตั้งค่าเบรกพอยต์บางส่วนจากบรรทัดคำสั่ง:
ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py
แม้ว่า-c c
จะใช้งานไม่ได้ด้วยเหตุผลบางประการ: https://github.com/gotcha/ipdb/issues/156
python -m module
มีการถามการดีบักที่: วิธีการดีบั๊กโมดูล Python ที่รันด้วย python -m จากบรรทัดคำสั่ง? และเนื่องจาก Python 3.7 สามารถทำได้ด้วย:
python -m pdb -m my_module
คุณสมบัติที่ขาดหายไปอย่างจริงจังของทั้ง pdb และ ipdb เมื่อเทียบกับ GDB:
ipdb รำคาญเฉพาะ:
ทดสอบใน Ubuntu 16.04, ipdb == 0.11, Python 3.5.2
มีอยู่วิธีการในปัจจุบันซึ่งแทนที่breakpoint()
import pdb; pdb.set_trace()
นอกจากนี้ยังมีคุณสมบัติใหม่หลายอย่างเช่นตัวแปรสภาพแวดล้อมที่เป็นไปได้
ถ้าคุณมาจาก Java / C # พื้นหลังผมคิดว่าทางออกที่ดีที่สุดของคุณจะใช้EclipseกับPydev มันให้ IDE ที่ใช้งานได้ดีกับ debugger ในตัวผมใช้มันกับ django ด้วย
https://wiki.python.org/moin/PythonDebuggingTools
pudb เป็นการแทนที่แบบดีสำหรับ pdb
Python Tutorเป็นดีบักเกอร์ขั้นตอนเดียวออนไลน์สำหรับผู้ฝึกหัด คุณสามารถใส่รหัสลงในหน้าแก้ไขจากนั้นคลิกที่ "Visualize Execution" เพื่อเริ่มการทำงาน
เหนือสิ่งอื่นใดก็รองรับ:
อย่างไรก็ตามมันยังไม่รองรับสิ่งต่าง ๆ มากมายเช่น:
io.StringIO
และio.BytesIO
แทน: สาธิตการโปรแกรมและการติดตามโดยใช้รหัสหลามเป็นไปได้โดยทางโปรแกรม (และง่ายมาก!) ดูเอกสารsys.settrace ()สำหรับรายละเอียดเพิ่มเติม นอกจากนี้ที่นี่คือการสอนให้คุณเริ่มต้น
Visual Studio พร้อม PTVS อาจเป็นตัวเลือกสำหรับคุณ: http://www.hanselman.com/blog/OneOfMicrosoftsBestKeptSecretsPythonToolsForVisualStudioPTVS.aspx
PyCharm เป็น IDE สำหรับ Python ที่มีดีบักเกอร์ ดูวิดีโอ YouTube นี้เพื่อรับรู้เบื้องต้นเกี่ยวกับการใช้ดีบักเกอร์ของ PyCharm เพื่อให้ได้รหัส
PyCharm Tutorial - Debug python code โดยใช้ PyCharm
หมายเหตุ: นี่ไม่ได้มีวัตถุประสงค์เพื่อรับรองหรือตรวจสอบ PyCharm เป็นผลิตภัณฑ์เชิงพาณิชย์ที่ต้องจ่าย แต่ บริษัท ให้สิทธิ์ใช้งานฟรีสำหรับนักเรียนและครูรวมถึงรุ่นชุมชน "เบา" ที่ฟรีและโอเพ่นซอร์ส