Отладка ошибки импорта Python (ModuleNotFoundError) - PullRequest
0 голосов
/ 15 января 2020

Short:

Я пытался отладить ModuleNotFoundError, который происходит в одном из моих локальных клонов репо.

Подробнее:

У меня есть два клона одного репо. У обоих есть основная ветка, проверенная в настоящее время. Я хочу запустить скрипт Python, который импортирует различные модули, которые импортируют другие модули и т. Д. c. В первом клоне репо я получаю ModuleNotFoundError: No module named 'TheModuleInQuestion'. Во втором клоне скрипт успешно импортирует все, что ему нужно, и запускается без ошибок - DESPITE sys.path, не содержащий repo-speci c foldernames, и несмотря на то, что все файлы, которые могут быть импортированы, присутствуют в первом репо тоже.

Я бы хотел отладить это, желательно с помощью pdb, наблюдая за процессом импорта, порядком поиска папок и путем импортированного модуля во втором репо. Я просмотрел руководства пользователя pdb в Интернете, но не нашел ничего подходящего для этого конкретного варианта использования. Как мне go сделать это?

Дополнительная информация

Все мои клоны репо находятся в подпапках ~ / git (или, поскольку я m, используя Git Bash на Windows 10, C: \ users \ myusername \ git)

Я использую Python 3.6.5 32-бит. Это не последняя версия, это версия, указанная компанией по причинам совместимости с каким-либо пакетом или другим.

>>> import sys
>>> sys.path
['', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36', 'C:\\Python36\\lib\\site-packages', 'c:\\users\\myusername\\downloads\\pyopenssl-master\\src']

После получения

ModuleNotFoundError: No module named 'TheModuleInQuestion'

Я искал свои клоны репо для файлов с именами, начинающимися «TheModuleInQuestion». В любом из них нет ModuleInQuestion.py. Различные папки содержат:

  • TheModuleInQuestion.dll
  • TheModuleInQuestion.pdb (вероятно, формат «База данных программ» от Microsoft. Я могу добавить его в теги с другим pdb.)
  • TheModuleInQuestion. xml
  • TheModuleInQuestion.dll.config
  • TheModuleInQuestion.dll-Справка. xml

1 Ответ

1 голос
/ 15 января 2020
Модули

Python могут быть чистыми Python (.py файлами) или двоичными файлами lib (.so для linux, .dll для Windows), так что скорее всего модуль, который вы ищете, "TheModuleInQuestion.dll".

wrt / "отладка процесса импорта с помощью pdb", вы не сможете здесь многое сделать, я боюсь - pdb работает только с чистым кодом python, и вся система импорта встроена ( часть времени выполнения python .exe).

Тем не менее вы можете ответить на два вопроса:

порядок поиска папок

Это sys.path, довольно просто. Это точно , что он определяет: порядок поиска папок. Кстати, тот факт, что он не содержит «никаких репо-спецификаций c foldernames», является нормальным и ожидаемым.

и путь импортированного модуля во втором репо

go ко второй папке репо, откройте оболочку python и введите

>>> import TheModuleInQuestion
>>> print(TheModuleInQuestion)

Теперь, если оба локальных репозитория являются клонами одного и того же удаленного узла и находятся в одной и той же ветви (у них одна и та же ревизия?), Между ними не должно быть большого различия. Я не знаю, какие инструменты сравнения доступны на Windows, но первое, что я здесь сделал бы, - это разложу репо.

Если из этого не выйдет ничего очевидного, я бы тогда проверил разрешения для файлов и папок (особенно для этих файлов "TheModuleInQuestion.xxx", конечно, но также и для всего пути, ведущего к нему).

И, наконец, - если бы больше ничего не решило проблему - я бы сделал 3-е клонирование репозитория и проверил бы его (в конце концов, проверяя различные ревизии). файлы часто хорошая идея. Я не думаю, что это что-то решит в вашем случае (если TheModuleInQuestion - это dll ...), но это все еще хорошая идея - иногда удаленный файл .py оставляет устаревшие .py c и тогда все ставки выключены; -)

...