ModuleNotFoundError при использовании importlib.import_module - PullRequest
1 голос
/ 14 июня 2019

У меня следующая структура папок, и у меня есть метод тестирования в util.py. Когда метод util запущен, я вижу ошибку с модулем, который импортируется в модуль, где я пытаюсь получить все классы.

Parent
--report <dir>
----__init__.py
----AReport.py
----names_list.py
--util.py

util.py

import inspect
import importlib
import importlib.util

def get_class_names(fileName):
    for name, cls in inspect.getmembers(importlib.import_module(fileName, package='report'), inspect.isclass):
        print(name, cls)

if __name__ == '__main__':
    get_class_names('report.names_list')

names_list.py

from AReport import AReport

class Team:
    name = ""
    def __init__(self, name):
        self.name = name

class Names_List(AReport):
    def __init__(self, name=None):
        AReport.__init__(self, name)

    def test(self):
        print('In test')        

AReport.py

from abc import ABCMeta, abstractmethod

class AReport(metaclass=ABCMeta):
    def __init__(self, name=None):
        if name:
            self.name = name

    def test(self):
        pass

Когда я запускаю свой тестовый метод из util, я получаю следующую ошибку:

ModuleNotFoundError: No module named AReport

Ответы [ 2 ]

2 голосов
/ 15 июня 2019

Если вы ничего не изменили с sys.path или PYTHONPATH, проблема в том, что модуль AReport не «виден» из util.py.

Вы можете проверить это, добавив это вверху util.py:

import sys
print(sys.path)

Это выведет список всех путей, где интерпретатор будет искать модули. Вы увидите, что там находится только путь к модулю Parent, потому что именно здесь был запущен util.py. Это объясняется в Путь поиска модуля Документация:

Когда импортируется модуль с именем spam, интерпретатор сначала ищет для встроенного модуля с таким именем. Если не найден, он ищет для файла с именем spam.py в списке каталогов, заданных переменная sys.path. sys.path инициализируется из этих мест:

  • Каталог, содержащий скрипт ввода (или текущий каталог когда файл не указан).
  • PYTHONPATH (список имен каталогов, с тем же синтаксисом, что и переменная оболочки PATH).
  • Зависит от установки по умолчанию.

Когда вы делаете

from AReport import AReport

он будет искать модуль AReport из каталога Parent, но его там нет, потому что только каталог report находится непосредственно в каталоге / path / to / Parent, поэтому Python вызывает ModuleNotFoundError. Если вы делаете вместо

from report.AReport import AReport

это будет работать, потому что пакет report находится в /path/to/Parent.

Если вы хотите избежать префикса report. при импорте, можно добавить пакет report в sys.path на util.py:

import sys
sys.path.append("./report")

print(sys.path)
# should now show the /path/to/Parent/report on the list

Тогда ваш from AReport импорт теперь будет работать. Другой вариант - добавить / path / to / Parent / report в переменную окружения PYTHONPATH перед запуском util.py.

export PYTHONPATH=$PYTHONPATH:/path/to/Parent/report

Обычно я использую опцию PYTHONPATH для тестов, поэтому мне не нужно изменять код.

0 голосов
/ 14 июня 2019

попробовать:

from report.AReport import AReport
...