Як перейти через код Python, щоб вирішити проблеми з налагодженням?


185

У Java / C # ви можете легко перейти через код, щоб простежити, що може піти не так, і IDE робить цей процес дуже зручним для користувачів.

Чи можете ви простежити пітон код подібним чином?

Відповіді:


264

Так! Там називається налагоджувач Pythonpdb саме для цього!

Ви можете запустити програму Python pdb, використовуючи pdb myscript.pyабоpython -m pdb myscript.py .

Існує кілька команд, які ви можете видавати, які задокументовані на pdbсторінці.

Деякі корисні пам’ятати:

  • b: встановити точку розриву
  • c: продовжуйте налагодження, поки не потрапите на точку розриву
  • s: перехід через код
  • n: перейти до наступного рядка коду
  • l: список вихідного коду для поточного файлу (за замовчуванням: 11 рядків, включаючи рядок, що виконується)
  • u: переміщення до кадру стека
  • d: переміщення вниз по рамці стека
  • p: надрукувати значення виразу в поточному контексті

Якщо ви не хочете використовувати налагоджувач командного рядка, деякі IDE, такі як Pydev , Wing IDE або PyCharm, мають відладчик графічного інтерфейсу. Wing і PyCharm - комерційна продукція, але Wing має безкоштовне "Особисте" видання, а PyCharm - безкоштовне громадське видання.


10
Нічого собі, я не можу повірити, що мені важко знайти графічний pdb для linux / ubuntu. Я щось пропускаю? Можливо, мені доведеться розробити плагін SublimeText для нього.
ThorSummoner

4
PyCharm досить гарний як графічний налагоджувач, а його Community Edition безкоштовний!
Пітер

@ThorSummoner, pudbчудово підходить для цього. Такожpydev
alpha_989

pdbне є інструментом командного рядка. Для його використання використовуйте python -m pdb your_script.py.
jdhao

@jdhao Я думаю, це не стандартно, але в Ubuntu pdbкоманда є частиною pythonпакету. У будь-якому випадку, python -m <module>це стає стандартом для інших речей, таких як pip, тому, ймовірно, найкраще використовувати це за замовчуванням.
wjandrea

55

Використовуючи інтерактивний налагоджувач Python 'pdb'

Перший крок - зробити так, щоб інтерпретатор Python перейшов у режим налагодження.

A. З командного рядка

Найбільш прямий шлях, що ведеться від командного рядка, інтерпретатора python

$ 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. Зсередини вашої програми

Для великого проекту та довго працюючого модуля можна запустити налагодження всередині програми за допомогою імпорту 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” (print)

    а) па

  5. Вимкнення підказки (Pdb)… за допомогою “c” (продовження)

  6. Бачити, де ти ... з "l" (список)

  7. Перехід до підпрограм ... з "s" (крок у)

  8. Продовження… але лише до кінця поточної підпрограми… із „r” (повернення)

  9. Призначте нове значення

    а) ! b = "B"

  10. Встановіть точку розриву

    а) розбийте білизну

    б) перервати ім'я функції

    в) зламати ім'я файлу: кількість ліній

  11. Тимчасова точка розриву

    а) обчислювальна кількість

  12. Умовна точка розриву

    а) розірвати білизну, стан

Примітка: ** Усі ці команди повинні виконуватися з ** pdb

Для поглиблених знань дивіться:

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

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


41

У python є модуль під назвою 'pdb'. Угорі вашого сценарію python ви робите

import pdb
pdb.set_trace()

і ви перейдете в режим налагодження. Ви можете використовувати "s" для переходу, "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, таких як контекстні лінії, стійка історія команд та автоматичне завершення вкладки :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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

Або ж, як і в сирому pdb 3.2+, ви можете встановити деякі точки перерви з командного рядка:

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

хоча -c cпорушено чомусь: https://github.com/gotcha/ipdb/isissue/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 # background, я думаю, найкращим варіантом буде використання Eclipse з Pydev . Це дає вам повністю функціональний IDE з вбудованим налагоджувачем. Я також використовую його з django.




2

Python Tutor - це одноетапний налагоджувач в Інтернеті, призначений для новачків. Ви можете ввести код для редагування а потім натиснути «Візуалізувати виконання», щоб почати його працювати.

Крім усього іншого, він підтримує:

Однак він також не підтримує багато речей , наприклад:

  • Читання / запис файлів - використання io.StringIOта io.BytesIOзамість цього: демонстрація
  • Занадто великий код, працює занадто довго або визначає занадто багато змінних чи об'єктів
  • Аргументи командного рядка
  • Багато стандартних модулів бібліотеки, таких як argparse, csv, enum, html, os, struct, slabref ...

1

Також можливо програматизувати кроки та відстежувати код python (і це просто!). Перегляньте документацію на sys.settrace () для отримання більш детальної інформації. Також ось підручник для початку роботи.



1

PyCharm - це IDE для Python, що включає відладчик. Перегляньте це відео на YouTube, щоб ознайомитись із використанням налагоджувача PyCharm для переходу коду.

Підручник PyCharm - Налагодження коду python за допомогою PyCharm

Примітка. Це не передбачається схвалення чи огляд. PyCharm - комерційний продукт, за який потрібно платити, але компанія надає безкоштовну ліцензію студентам та викладачам, а також "легку" версію спільноти, яка є безкоштовною та відкритим.

Знімок екрана

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.