ขั้นตอนในการใช้รหัส Python เพื่อช่วยในการแก้ไขปัญหา


186

ใน Java / C # คุณสามารถทีละขั้นตอนรหัสเพื่อติดตามสิ่งที่อาจจะผิดพลาดและ IDE ทำให้กระบวนการนี้เป็นมิตรต่อผู้ใช้

คุณสามารถติดตามรหัสไพ ธ อนในลักษณะที่คล้ายกันได้หรือไม่?

คำตอบ:


264

ใช่ มีโปรแกรมดีบัก Python pdbสำหรับการทำสิ่งนั้น!

คุณสามารถเปิดโปรแกรมหลามผ่านpdbโดยใช้หรือpdb myscript.pypython -m pdb myscript.py

มีคำสั่งไม่กี่คำที่คุณสามารถออกได้ซึ่งมีเอกสารอยู่ในpdbหน้านั้น

สิ่งที่มีประโยชน์ที่ควรจำคือ:

  • b: ตั้งค่าเบรกพอยต์
  • c: ทำการดีบักต่อไปจนกว่าคุณจะถึงจุดพัก
  • s: ก้าวผ่านรหัส
  • n: เพื่อไปที่บรรทัดถัดไปของรหัส
  • l: ลิสต์ซอร์สโค้ดสำหรับไฟล์ปัจจุบัน (ค่าเริ่มต้น: 11 บรรทัดรวมถึงบรรทัดที่กำลังดำเนินการ)
  • u: นำทางขึ้นกรอบสแต็ค
  • d: เลื่อนเฟรมสแต็กลง
  • p: เพื่อพิมพ์ค่าของนิพจน์ในบริบทปัจจุบัน

หากคุณไม่ต้องการใช้ดีบักเกอร์บรรทัดคำสั่ง IDE บางตัวเช่นPydev , Wing IDEหรือPyCharmจะมีตัวดีบัก GUI Wing และ PyCharm เป็นผลิตภัณฑ์เชิงพาณิชย์ แต่ Wing มีรุ่น "ส่วนตัว" ฟรีและ PyCharm มีรุ่นชุมชนฟรี


10
ว้าวฉันไม่อยากจะเชื่อเลยว่าฉันกำลังหา pdb แบบกราฟิกสำหรับ linux / ubuntu ฉันพลาดอะไรไปรึเปล่า? ฉันอาจต้องมองหาการสร้าง SublimeText Plugin ให้กับมัน
ThorSummoner

4
PyCharm ค่อนข้างดีในฐานะดีบักเกอร์แบบกราฟิกและ Community Edition นั้นฟรี!
Pieter

@ThorSummoner pudbเหมาะสำหรับสิ่งนั้น นอกจากนี้pydev
alpha_989

pdbไม่ใช่เครื่องมือบรรทัดคำสั่ง python -m pdb your_script.pyที่จะใช้มันใช้
jdhao

@jdhao ฉันเดาว่ามันไม่ได้มาตรฐาน แต่บน Ubuntu pdbคำสั่งเป็นส่วนหนึ่งของpythonแพ็คเกจ ไม่ว่าในกรณีใดการpython -m <module>กลายเป็นมาตรฐานสำหรับสิ่งอื่น ๆ เช่นpipกันดังนั้นจึงควรใช้สิ่งนั้นเป็นค่าเริ่มต้น
wjandrea

55

โดยใช้ Python Interactive Debugger 'pdb'

ขั้นตอนแรกคือการทำให้ 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()

การดีบักแบบทีละขั้นตอนเพื่อเข้าสู่ภายในมากขึ้น

  1. ดำเนินการคำสั่งถัดไป…ด้วย“ n” (ถัดไป)

  2. ทำซ้ำคำสั่งการดีบักครั้งล่าสุด ... ด้วยENTER

  3. เลิกทั้งหมด ... ด้วย“ q” (ออกจาก)

  4. การพิมพ์ค่าของตัวแปร ... ด้วย“ p” (พิมพ์)

    ก) ต่อปี

  5. การปิดพรอมต์ (Pdb) ... ด้วย“ c” (ดำเนินการต่อ)

  6. ดูว่าคุณอยู่ที่ไหน…ด้วย“ l” (รายการ)

  7. ก้าวเข้าสู่รูทีนย่อย ... ด้วย“ s” (เข้าสู่)

  8. ดำเนินการต่อ ... แต่ต่อท้ายรูทีนย่อยปัจจุบัน ... ด้วย“ r” (return)

  9. กำหนดค่าใหม่

    a) ! b = "B"

  10. ตั้งค่าเบรกพอยต์

    a) ทำลายผ้าลินิน

    b) แบ่งชื่อฟังก์ชั่น

    c) แบ่งชื่อไฟล์: linenumber

  11. จุดพักชั่วคราว

    a) ผ้าลินิน tbreak

  12. เบรกพอยต์แบบมีเงื่อนไข

    a) ทำลายชุดเครื่องนอน

หมายเหตุ: ** คำสั่งเหล่านี้ควรถูกเรียกใช้จาก ** pdb

สำหรับความรู้ในเชิงลึกดู: -

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/


41

มีโมดูลที่เรียกว่า 'pdb' ใน python ที่ด้านบนสุดของสคริปต์ไพ ธ อนของคุณ

import pdb
pdb.set_trace()

และคุณจะเข้าสู่โหมดแก้ไขข้อบกพร่อง คุณสามารถใช้ 'ถึง' ขั้นตอน 'n' เพื่อติดตามบรรทัดถัดไปคล้ายกับสิ่งที่คุณจะทำกับดีบักเกอร์ 'gdb'


21

การเริ่มต้นใน Python 3.7 คุณสามารถใช้breakpoint()ฟังก์ชันในตัวเพื่อเข้าสู่การดีบักเกอร์:

foo()
breakpoint()  # drop into the debugger at this point
bar()

โดยค่าเริ่มต้นbreakpoint()จะนำเข้าและโทรpdb pdb.set_trace()อย่างไรก็ตามคุณสามารถควบคุมพฤติกรรมการแก้จุดบกพร่องผ่านและการใช้ตัวแปรสภาพแวดล้อมsys.breakpointhook()PYTHONBREAKPOINT

ดูPEP 553สำหรับข้อมูลเพิ่มเติม


2
เมื่อฉันเห็นbreakpointฉันรู้สึกตื่นเต้น แต่จากนั้นฉันได้เรียนรู้ว่ามันเป็นเพียงทางลัดimport pdb; pdb.set_trace()และทำให้ฉันเศร้า Python devs: โปรดเน้นที่การปรับปรุง PDB ด้วยคุณสมบัติ GDB พื้นฐานเช่นบรรทัดบริบทประวัติคำสั่งถาวรและการ
ป้อน

11

ipdb (ดีบัก IPython)

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

แต่โดยทั่วไปคุณไม่ต้องการทำเช่นนั้นเพราะ:

  • คุณจะต้องผ่านทุกฟังก์ชั่นและคำจำกัดความของคลาสเนื่องจาก Python อ่านบรรทัดเหล่านั้น
  • ฉันไม่รู้วิธีตั้งขนาดบริบทโดยไม่แฮ็ค ipdb แพทช์เพื่ออนุญาต: https://github.com/gotcha/ipdb/pull/155

หรืออีกทางหนึ่งเช่นเดียวกับ 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



3

ถ้าคุณมาจาก Java / C # พื้นหลังผมคิดว่าทางออกที่ดีที่สุดของคุณจะใช้EclipseกับPydev มันให้ IDE ที่ใช้งานได้ดีกับ debugger ในตัวผมใช้มันกับ django ด้วย




2

Python Tutorเป็นดีบักเกอร์ขั้นตอนเดียวออนไลน์สำหรับผู้ฝึกหัด คุณสามารถใส่รหัสลงในหน้าแก้ไขจากนั้นคลิกที่ "Visualize Execution" เพื่อเริ่มการทำงาน

เหนือสิ่งอื่นใดก็รองรับ:

อย่างไรก็ตามมันยังไม่รองรับสิ่งต่าง ๆ มากมายเช่น:

  • การอ่าน / เขียนไฟล์ - ใช้io.StringIOและio.BytesIOแทน: สาธิต
  • รหัสที่มีขนาดใหญ่เกินไปเรียกใช้นานเกินไปหรือกำหนดตัวแปรหรือวัตถุมากเกินไป
  • อาร์กิวเมนต์บรรทัดคำสั่ง
  • โมดูลไลบรารีมาตรฐานมากมายเช่น argparse, csv, enum, html, os, struct, weakref ...

1

การโปรแกรมและการติดตามโดยใช้รหัสหลามเป็นไปได้โดยทางโปรแกรม (และง่ายมาก!) ดูเอกสารsys.settrace ()สำหรับรายละเอียดเพิ่มเติม นอกจากนี้ที่นี่คือการสอนให้คุณเริ่มต้น



1

PyCharm เป็น IDE สำหรับ Python ที่มีดีบักเกอร์ ดูวิดีโอ YouTube นี้เพื่อรับรู้เบื้องต้นเกี่ยวกับการใช้ดีบักเกอร์ของ PyCharm เพื่อให้ได้รหัส

PyCharm Tutorial - Debug python code โดยใช้ PyCharm

หมายเหตุ: นี่ไม่ได้มีวัตถุประสงค์เพื่อรับรองหรือตรวจสอบ PyCharm เป็นผลิตภัณฑ์เชิงพาณิชย์ที่ต้องจ่าย แต่ บริษัท ให้สิทธิ์ใช้งานฟรีสำหรับนักเรียนและครูรวมถึงรุ่นชุมชน "เบา" ที่ฟรีและโอเพ่นซอร์ส

ภาพหน้าจอ

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