python pytest导入导入本地模块的模块

djs*_*akz 3 python pytest

我有以下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
Run Code Online (Sandbox Code Playgroud)

在我的测试(pytest) 中,我是这样导入的:

from src.service1.codebase.waiter import check_status

为了在 service1 模块中导入特定功能。

waiter.pyservice1 中,我正在从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'.
Run Code Online (Sandbox Code Playgroud)

这发生在测试运行,那感觉就像waiter.py没有在其本地目录中查找logger.py,而是可能在其他位置?

将其更改为

from .logger import configure_logger

不解决有关部署到这个与运行时我计划中的问题,但根源问题(服务1单拉链没有父目录),从而使错误Unable to import module 'main': attempted relative import with no known parent package

是否可以不使用相对导入并让我的测试了解在哪里可以找到所需的文件?

djs*_*akz 5

添加import os, sys; sys.path.append(os.path.dirname(os.path.realpath(__file__)))__init__.pycodebase/ 文件夹解决了这个问题。


b-f*_*-fg 1

该包src应包含__init__.py根级别的文件以表明它是一个包。然后您可以使用绝对或相对路径从其他文件导入。绝对路径是

from src.service1.codebase.logger import configure_logger
Run Code Online (Sandbox Code Playgroud)

但是您的相对路径应该在包含文件后起作用__init__.py

检查此答案以获取更多信息。