Как отладить встроенную команду, пакет или модуль Python? - PullRequest
1 голос
/ 20 января 2020

Я хотел бы отладить некоторые из базовых c пакетов, которые поставляются с установкой Python и / или являются встроенными, включая pip и venv.

Желание исходит из сообщения об ошибке прав доступа к файлу (невозможно получить доступ к файлу с «непечатаемым именем файла»), некоторые из моей команды запускают эти команды - см. этот вопрос для получения подробной информации.

Вопрос

Как отлаживать исходный код Python при попытке отловить проблемы в основном исполняемом файле python или при непосредственном запуске базового модуля python (см. Следующие примеры для pip и venv)?

$ python -m pip install --upgrade
$ python -m venv .venv

Если это имеет значение, моей средой является VSCode, где я с радостью могу задействовать отладчик для любого собственного сценария, который я написал, используя встроенный отладчик, который взаимодействует (я полагаю, ) с основным расширением Microsoft Python.

Ответы [ 2 ]

4 голосов
/ 20 января 2020

Начните с просмотра исходного кода этих модулей; переключатель -m ищет пакет или модуль для импорта первым. Если это пакет, Python импортирует модуль __main__ в этот пакет и запускает его как основной скрипт. Если это модуль, сам модуль импортируется и запускается как __main__.

Обычно код структурирован так, что вызывается функция, которую вы также можете импортировать напрямую. Затем вы можете просто написать код, который импортирует ту же функцию и вызывает ее так же, как и модуль __main__. С этого момента тривиально запустить его в отладчике.

Например, pip - это пакет, поэтому python -m pip импортирует pip.__main__ и запускает его как скрипт. Затем запускается:

from pip._internal.cli.main import main as _main  # isort:skip # noqa

if __name__ == '__main__':
    sys.exit(_main())

для запуска. Вы можете сделать то же самое в VSCode; импортируйте pip._internal.cli.main.main и вызывайте его.

Вы можете найти исходный код для этих модулей, просто импортировав их и распечатав получившийся объект:

python -c "import pip; print(pip)"

представление модуля, если он загружен с диска, будет включать его имя файла. Если имя файла оканчивается на /__init__.py, это пакет, поэтому вы также можете проверить, существует ли файл __main__.py:

python -c "import pip.__main_; print(pip.__main__)"

Вы можете сделать то же самое для модуля venv. Эта часть является частью стандартной библиотеки Python, поэтому документация на самом деле напрямую связана с исходным кодом , а модуль venv.__main__ просто импортирует venv.main() и называет это.

1 голос
/ 22 января 2020

Вам нужно будет установить "justMyCode": false в вашем launch.json, чтобы отладчик мог отслеживать сторонний код.

...