Смежный вопрос по SO (сам по себе ранее сегодня): Почему при трассировке ошибок отображается отредактированный скрипт вместо того, что на самом деле выполнялось? Теперь я знаю , почему это происходит, тогда я хочутеперь как Я могу справиться с этим.
Я вижу некоторые вопросы, такие как Как эффективно отлаживать с помощью spyder в Python? и Как распечатать сообщения отладки в консоли Google Chrome JavaScript? хорошо принято,поэтому я полагаю, что вопрос о методах отладки стоит по теме, верно?
Справочная информация
Я пишу скрипт, который вызывает исключение в строке n , запускаю его из терминала, добавляюстрока посередине, пока скрипт еще работает, и сохраните измененный файл.Таким образом, файл сценария изменяется, пока его выполняет интерпретатор.Особенно изменился номер самой строки, которая вызовет исключение.Отчет об отслеживании ошибок интерпретатором Python показывает мне строку n «модифицированной» версии скрипта, а не фактической «работающей» версии.
Минимальный пример
Допустим, я запускаю скрипт:
import time
time.sleep(5)
raise Exception
, и, хотя переводчик застрял на time.sleep(5)
, я добавляю строку после этого.
Так что теперь у меня есть:
import time
time.sleep(5)
print("Hello World")
raise Exception
Затем интерпретатор выходит из спящего режима, выполняется следующая команда raise Exception
, и программа завершается со следующей трассировкой.
Трассировка (последний вызов последним):
Файл "test / minimal_error.py", строка 4, в
print ("Hello World")
Исключение
Таким образом, он правильно сообщает номер строки (из оригинального скрипта, поэтому фактически бесполезен, если у нас есть только модифицированный скрипт) и сообщения об ошибке («Исключение»).Но он показывает совершенно неверную строку кода, которая фактически вызвала ошибку;если бы это было чем-то полезным, должно отображаться raise Exception
, а не print("Hello World")
, что даже не было выполнено переводчиком.
Почему это важно
На практике,Я внедряю одну часть программы, запускаю ее, чтобы посмотреть, хорошо ли работает эта часть, и пока она еще работает, я перехожу к следующему, что мне нужно реализовать.И когда скрипт выдает ошибку, я должен найти, какая именно строка кода вызвала ошибку.Обычно я просто читаю сообщение об ошибке и пытаюсь определить исходный код, вызвавший его.
Иногда это не так просто угадать, поэтому я копирую скрипт в буфер обмена и откатываю код, отменив то, чтонаписано после запуска скрипта, проверьте строку, вызвавшую ошибку, и вставьте обратно из буфера обмена.Иногда это очень раздражает, потому что не всегда можно вспомнить точное состояние скрипта, когда я его запускал.(«Нужно ли отменить больше для отката? Или это именно тот сценарий, который я запустил?»)
Иногда сценарий запускается более 10 минут или даже за час доэто вызывает исключение.В таком случае «откат отменить» практически невозможен.Иногда я даже не знаю, как долго будет работать скрипт, прежде чем он будет запущен.Я, очевидно, не могу просто сидеть и держать свой скрипт без изменений до его завершения.
Вопрос
Каким образом я могу правильно отследить команду, вызвавшую исключение?
Одно из гипотетических решений - копировать скрипт в новый файл каждый раз, когда я хочу его запустить, запустить скопированную версию и продолжить редактирование оригинальной.Но я думаю, что это слишком утомительно, чтобы делать это каждые десять минут, когда мне нужно запустить скрипт, чтобы посмотреть, хорошо ли он работает.
Другой способ - это git-commit каждый раз, когда я хочу его запустить, так чтоЯ могу вернуться и посмотреть оригинальную версию, когда мне нужно, но это сделает историю коммитов очень грязной, поэтому я думаю, что это даже хуже, чем другая.
Я такжепробовал python -m pdb -m script.py
, но он показывает ту же "модифицированную версию строки n ", как и обычная трассировка.
Так есть ли какое-нибудь практическое решение, которое я могу практиковать, скажем, каждые десять минут?