Поради щодо налагодження Python [закрито]


164

Які ваші найкращі поради щодо налагодження Python?

Будь ласка, не просто перераховуйте конкретний налагоджувач, не кажучи, що він може насправді зробити.

Пов'язані


Відповіді:


139

ПТБ

Ви можете використовувати модуль pdb, вставити pdb.set_trace()будь-де, і він буде функціонувати як точка розриву.

>>> import pdb
>>> a="a string"
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) p a
'a string'
(Pdb)

Для продовження виконання використовуйте c(або contабо continue).

Можна виконувати довільні вирази Python за допомогою pdb. Наприклад, якщо ви виявили помилку, ви можете виправити код, а потім введіть вираз типу, щоб мати такий же ефект у запущеному коді

ipdb - це версія pdb для IPython . Це дозволяє використовувати pdb з усіма функціями IPython, включаючи завершення вкладки.

Можна також встановити pdb для автоматичного запуску за винятковим винятком.

Pydb був написаний як вдосконалена версія Pdb. Переваги?


Ось стаття про використання pdb
sontek

Особисто мені ipdb більше подобається .
Сардатріон - проти зловживань з боку SE,

1
Мабуть, є переписання pydb під назвою pydbgr
Ehtesh Choudhury

SublimeText має чудовий плагін, щоб додати точки прориву
Денніс Голомазов

Якщо ви розробляєте веб-додаток, додайте перегляд myserver.com/pdbу режимі налагодження, який просто робить import pdb; pdb.set_trace(). Якщо ви використовуєте Flask / Werkzeug, який має інтерактивний налагоджувач, ви також можете мати вигляд, який так і є assert False.
osa

78

http://pypi.python.org/pypi/pudb , повноекранний налагоджувач Python на основі консолі.

Її мета - забезпечити всі смаки сучасних налагоджувачів на основі GUI у більш легкому та зручному для клавіатури пакеті. PuDB дозволяє налагоджувати код там, де ви пишете і тестуєте його - в терміналі. Якщо ви працювали з чудовими (але сьогодні древніми) DOS-інструментами Turbo Pascal або C, то інтерфейс PuDB може виглядати звичним.

скріншот pudb

Приємно для налагодження автономних сценаріїв, просто запустіть

python -m pudb.run my-script.py

Встановити зpip install pudb
congusbongus

40

Якщо ви використовуєте pdb, ви можете визначити псевдоніми для ярликів. Я використовую ці:

# Ned's .pdbrc

# Print a dictionary, sorted. %1 is the dict, %2 is the prefix for the names.
alias p_ for k in sorted(%1.keys()): print "%s%-15s= %-80.80s" % ("%2",k,repr(%1[k]))

# Print the instance variables of a thing.
alias pi p_ %1.__dict__ %1.

# Print the instance variables of self.
alias ps pi self

# Print the locals.
alias pl p_ locals() local:

# Next and list, and step and list.
alias nl n;;l
alias sl s;;l

# Short cuts for walking up and down the stack
alias uu u;;u
alias uuu u;;u;;u
alias uuuu u;;u;;u;;u
alias uuuuu u;;u;;u;;u;;u
alias dd d;;d
alias ddd d;;d;;d
alias dddd d;;d;;d;;d
alias ddddd d;;d;;d;;d;;d

Як ви визначаєте ці псевдоніми?
Casebash

9
Покладіть цей матеріал у ~ / .pdbrc
Нед

у Windows ви можете помістити його в ~ / _ipython / ipythonrc.ini
швидке множення

33

Ведення журналів

У Python вже є відмінний вбудований модуль реєстрації даних . Тут ви можете скористатися шаблоном журналу .

Модуль реєстрації дозволяє визначити рівень важливості; під час налагодження ви можете реєструвати все, тоді як під час звичайної роботи ви можете реєструвати лише критичні речі. Ви можете вимикати та вмикати речі.

Більшість людей просто використовують основні заяви друку для налагодження, а потім видаляють оператори друку. Краще залишити їх, але відключити; тоді, коли у вас є інша помилка, ви можете просто знову включити все і переглянути свої журнали.

Це може бути найкращим можливим способом налагодження програм, яким потрібно швидко робити такі дії, як, наприклад, мережеві програми, на які потрібно реагувати перед тим, як закінчується та вимикається інший кінець мережевого з'єднання. Можливо, у вас не буде багато часу для одномоментного налагодження; але ви можете просто дозволити своєму коду запускатись і записувати все в журнал, а потім переглядати журнали та з’ясовувати, що насправді відбувається.

EDIT: Початкова URL-адреса для шаблонів була: http://aymanh.com/python-debugging-techniques

Ця сторінка відсутня, тому я замінив її посиланням на знімок, збережений на archive.org: http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-techniques

У випадку, якщо він знову зникне, ось ось згадані нами шаблони. Це код, взятий з блогу; Я не писав цього.

import logging
import optparse

LOGGING_LEVELS = {'critical': logging.CRITICAL,
                  'error': logging.ERROR,
                  'warning': logging.WARNING,
                  'info': logging.INFO,
                  'debug': logging.DEBUG}

def main():
  parser = optparse.OptionParser()
  parser.add_option('-l', '--logging-level', help='Logging level')
  parser.add_option('-f', '--logging-file', help='Logging file name')
  (options, args) = parser.parse_args()
  logging_level = LOGGING_LEVELS.get(options.logging_level, logging.NOTSET)
  logging.basicConfig(level=logging_level, filename=options.logging_file,
                      format='%(asctime)s %(levelname)s: %(message)s',
                      datefmt='%Y-%m-%d %H:%M:%S')

  # Your program goes here.
  # You can access command-line arguments using the args variable.

if __name__ == '__main__':
  main()

І ось його пояснення, як користуватися вищесказаним. Знову ж таки, я не отримую за це кредиту:


За замовчуванням модуль реєстрації друкує критичні, помилки та попереджувальні повідомлення. Щоб змінити це, щоб усі рівні були надруковані, використовуйте:

$ ./your-program.py --logging=debug

Щоб надіслати повідомлення журналу у файл, який називається debug.log, використовуйте:

$ ./your-program.py --logging-level=debug --logging-file=debug.log


1
Проблема з модулем реєстрації полягає в тому, що він сильно ламається з Unicode і для його роботи в інтернаціоналізованих додатках потрібні різні обхідні шляхи. Хоча це все ще найкраще рішення для журналу Python.
Яцек Коньєчний

Посилання "шаблон реєстрації тут" мертве. Будь ласка, оновіть.
Йоханна

20

Можна надрукувати те , що виконуються лінії Python (спасибі Geo!). Це будь-яка кількість застосунків, наприклад, ви можете змінити його, щоб перевірити, коли викликуються певні функції, або додати щось на зразок ##, щоб він відстежував лише певні рядки.

code.interact переведе вас в інтерактивну консоль

import code; code.interact(local=locals())

Якщо ви хочете мати можливість легко отримати доступ до історії консолі, подивіться: " Чи можу я мати механізм історії, як у оболонці? " (Доведеться подивитися на це).

Автоматичне завершення може бути включено для перекладача .



17

print заяви

  • Деякі люди рекомендують debug_printфункцію замість друку для зручного відключення
  • pprintМодуль має неоціненне значення для складних структур

3
+1, коли кожен налагоджувач не вдається, друк - ваш друг, так debug_print було б гарним доповненням
Anurag Uniyal

Я, як правило, друкую спочатку, а потім налагоджую другий, за винятком випадків, коли я знаю , що зможу вирішити, простеживши певний розділ
Casebash

4
Насправді модуль журналу робить саме це.
e-satis

Щоправда, але реєстрація повинна бути налаштована. Я дізнаюся, як користуватися модулем після відзнаки
Casebash

друк може бути корисним для простих випадків і особливо при розробці проектів з невеликим часом запуску. З іншого боку, це може викликати звикання, і його використання через pdb або будь-який інший налагоджувач у складніших сценаріях, як правило, спричинить вам головні болі
vinilios

16

очевидний спосіб налагодження сценарію

python -m pdb script.py
  • корисно, коли цей сценарій викликає виняток
  • корисно при використанні команди virtualenv та pdb не працює з версією python venvs.

якщо ви точно не знаєте, де цей сценарій

python -m pdb ``which <python-script-name>``

15

PyDev

У PyDev є досить непоганий інтерактивний налагоджувач. У ньому є вирази годин, перехід на оцінку, списки потоків та стеків та (майже) всі звичні зручності, які ви очікуєте від сучасного візуального налагоджувача. Ви навіть можете приєднатися до запущеного процесу та зробити віддалену налагодження.

Як і інші візуальні налагоджувачі, я вважаю, що це корисне здебільшого для простих проблем або для дуже складних проблем після того, як я спробував все інше. Я все ще роблю більшість важких підйомів з лісозаготівлею.


Чи має вона можливість редагувати та продовжувати?
Casebash

@CaseBash ні, це не так, але ця функція планується. Незважаючи на те, що швидкість і простота встановлення / зняття точок
прориву


12

Winpdb дуже приємний, і всупереч своїй назві він повністю крос-платформний.

У нього дуже хороший налагодження на основі підказок та GUI та підтримує віддалену налагодження.


@Casebash - додав більше деталей
orip

1
+1 Це єдиний налагоджувач python, який я знайшов поки що, який може працювати з багатопотоковою нарізкою.
Лі Нішертон

Будьте обережні з його "поводженням" з багатопотоковою резьбою - будь-який виняток у будь-якій нитці змушує замерзнути весь процес. Непогана річ, якщо ви про це знаєте, дуже болісно, ​​якщо ви цього не зробите
Walt W

Проект виглядає мертвим станом на квітень 2014 року
Alojz Janez

7

У Vim у мене є ці три прив’язки:

map <F9> Oimport rpdb2; rpdb2.start_embedded_debugger("asdf") #BREAK<esc>
map <F8> Ofrom nose.tools import set_trace; set_trace() #BREAK<esc>
map <F7> Oimport traceback, sys; traceback.print_exception(*sys.exc_info()) #TRACEBACK<esc>

rpdb2це віддалений налагоджувач Python, який можна використовувати з WinPDB, суцільним графічним налагоджувачем. Оскільки я знаю, що ви запитаєте, він може зробити все, що я очікую, щоб зробити графічний налагоджувач :)

Я використовую pdbз nose.toolsтак що я можу налагоджувати юніт - тести, а також нормальний код.

Нарешті, на F7карті буде надруковано прослідкування (подібне до виду, який ви отримуєте, коли виняток пропускається у верхній частині стека). Я вважаю це дійсно корисним більше ніж кілька разів.


4

Визначення корисних методів repr () для ваших класів (щоб ви могли бачити, що таке об’єкт) та використовуючи формат repr () або "% r"% (...) або "... {0! R} ..". (...) у ваших повідомленнях / журналах налагодження IMHO - це ключ до ефективної налагодження.

Також налагоджувачі, згадані в інших відповідях, використовуватимуть методи repr ().


2

Отримання сліду стека з запущеної програми Python

Є декілька хитрощів тут . До них належать

  • Увірвання перекладача / друку трасування стека шляхом надсилання сигналу
  • Виведення сліду стека з непідготовленого процесу Python
  • Запуск інтерпретатора прапорами, щоб зробити його корисним для налагодження

2

Якщо вам не подобається проводити час у налагоджувачах (і не цінуєте погану зручність використання pdbінтерфейсу командного рядка), ви можете скинути сліди виконання та проаналізувати їх пізніше. Наприклад:

python -m trace -t setup.py install > execution.log

Це дозволить скинути всі рядки для setup.py installвиконання execution.log.

Щоб полегшити налаштування виводу трас і записати власні трассери, я зібрав кілька фрагментів коду в модуль xtrace (загальнодоступний домен).


1

Коли це можливо, я налагоджую використання M-x pdbв emacs для налагодження рівня джерела.


1

Існує повний онлайн-курс під назвою " Налагодження програмного забезпечення " Андреаса Зеллера на сайті Udacity, у якому є поради щодо налагодження:

Підсумок курсу

У цьому класі ви дізнаєтесь, як налагоджувати програми систематично, як автоматизувати процес налагодження та побудувати кілька автоматизованих інструментів налагодження в Python.

Навіщо брати цей курс?

В кінці цього курсу ви отримаєте чітке розуміння систематичної налагодження, знаєте, як автоматизувати налагодження, і будете вбудовані кілька функціональних інструментів налагодження в Python.

Передумови та вимоги

Необхідні базові знання програмування та Python на рівні Udacity CS101 або вище. Базове розуміння об'єктно-орієнтованого програмування є корисним.

Настійно рекомендується.


0

Якщо ви хочете приємно графічно роздрукувати стек свого дзвінка у читаному вигляді, перегляньте цю утиліту: https://github.com/joerick/pyinstrument

Запустити з командного рядка:

python -m pyinstrument myscript.py [args...]

Запустити як модуль:

from pyinstrument import Profiler

profiler = Profiler()
profiler.start()

# code you want to profile

profiler.stop()
print(profiler.output_text(unicode=True, color=True))

Виконати з джанго:

Просто додайте pyinstrument.middleware.ProfilerMiddlewareдо MIDDLEWARE_CLASSES, потім додайте ?profileв кінці запиту URL для активації Профілювальники.

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