Python Pytest импортирующие модули, которые импортируют локальные модули - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть следующая структура проекта python3:

tests/
    - testsuite_service1/
        - test_main.py
    - testsuite_service2/
        - test_main.py
src/
    - service1/
       - codebase/
           - __init__.py
           - main.py
           - logger.py
           - waiter.py
    - service2/
       - codebase/
           - __init__.py
           - main.py
           - logger.py
           - waiter.py

В моих тестах (pytest) , я импортирую так:

from src.service1.codebase.waiter import check_status

Для импорта определенной функции в модуле service1.

Внутри waiter.py в сервисе1 Я импортирую функцию из logger.py, вот так

from logger import configure_logger

однако при запуске тестов я получаю ошибку:

Traceback:
tests/test_main/test_main.py:3: in <module>
    from src.service1.codebase.waiter import check_status
src/codebase/waiter.py:8: in <module>
    from logger import configure_logger
E   ModuleNotFoundError: No module named 'logger'.

Это происходит при запуске теста, такое чувство, что waiter.py не ищет в своем локальном каталоге, чтобы найти logger.py, а может быть в каком-то другом месте?

Изменение на

from .logger import configure_logger

действительно решает проблему, но вызывает проблемы со средой выполнения, которую я планирую развернуть в (один zip-файл service1 без родительского каталога) и, таким образом, выдает ошибку Unable to import module 'main': attempted relative import with no known parent package

Можно ли не использовать относительный импорт, и мой тест понимает, где найти нужные файлы?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Добавление import os, sys; sys.path.append(os.path.dirname(os.path.realpath(__file__))) к __init__.py в базе кодов / папке решило проблему.

0 голосов
/ 11 ноября 2018

Пакет src должен содержать файл __init__.py на корневом уровне, чтобы указать, что это пакет. Затем вы можете использовать абсолютные или относительные пути для импорта из других файлов. Абсолютный путь будет

from src.service1.codebase.logger import configure_logger

Но ваш относительный путь должен работать после включения файла __init__.py.

Проверьте этот ответ для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...