Python Отладчик (pdb): навигация по многомодульному коду с использованием pdb - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть код, разделенный на три модуля; Модули следующие: 1) run_module.py 2) module1.py 3) module2.py

У меня есть if name == ' main ': оператор внутри run_module.py, и мне очень удобно использовать мой CLI для выполнения python -b pdb run_module.py, а затем установить точку останова внутри run_module.py с использованием формата белья (pdb) b.

Мой вопрос это: Как я могу установить точки останова внутри module1.py или module2.py из CLI; ie. не вмешиваться непосредственно в скрипты module1.py и module2.py и вводить import pdb; pdb.set_trace ()?

Любое понимание будет чрезвычайно ценно. Большое спасибо заранее.

1 Ответ

0 голосов
/ 20 апреля 2020

pdb, как gdb или trepan3k имеет команду разрыва:

(Pdb) help break
b(reak) ([file:]lineno | function) [, condition]
With a line number argument, set a break there in the current
file.  With a function name, set a break at first executable line
of that function.  Without argument, list all breaks.  If a second
argument is present, it is a string specifying an expression
which must evaluate to true before the breakpoint is honored.

The line number may be prefixed with a filename and a colon,
to specify a breakpoint in another file (probably one that
hasn't been loaded yet).  The file is searched for on sys.path;
the .py suffix may be omitted.

Но когда вы делаете это, есть некоторые вещи, о которых вы должны знать.

Если указать точки останова по имени файла и номеру строки, можно получить сообщение об ошибке. Например:

(Pdb) break foo.py
*** The specified object 'foo.py' is not a function
or was not found along sys.path.

Давайте попробуем понять, что говорится в сообщении. foo.py явно не является функцией. Это файл. Это в sys.path?

(Pdb) import sys
(Pdb) sys.path
['', '/usr/lib/python3.6', ...]

Нет. Хорошо. ну как насчет того, чтобы я дал имя файла как абсолютный путь?

(Pdb) break /tmp/bug.py:2
Breakpoint 1 at /tmp/bug.py:2

Хорошо. Это работает. Но опять же есть предостережение: можно ли остановиться на этой строке в этом файле? Посмотрите это:

(Pdb) break /etc/hosts:1
Breakpoint 2 at /etc/hosts:1

/etc/hosts - это файл, но это не программа Python. И хотя, как мы видели ранее, pdb предупреждает, что файл отсутствует, он не проверяет, является ли файл Python.

Если вместо этого вы запускаете это с trepan3k, то он выводит неприятный след (который я исправлю в какой-то момент), но, по крайней мере, он дает некоторое представление о том, что что-то не так.

Кроме того, pdb не слишком умен, чтобы знать, есть ли в строке 2 код, на котором можно остановиться; pdb будет предупреждать о пустых или пустых строках или строках комментариев, но что-нибудь более сложное, например, произвольный текст и отсутствие кубиков.

Опять же, trepan3k немного лучше:

(trepan3k) break /tmp/bug.py:2
** File /tmp/bug.py is not stoppable at line 2.

Последнее предостережение при работе с точками останова состоит в том, что точка останова не может быть достигнута, потому что код никогда не попадет туда. Но у вас это тоже есть с sys.set_trace(), так что я думаю, что такое поведение не удивительно.

...