python pytest导入模块,用于导入本地模块

时间:2018-11-11 11:45:32

标签: 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

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

from src.service1.codebase.waiter import check_status

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

在service1的waiter.py内,我像这样从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

确实可以解决问题,但会导致运行时出现问题,我计划将其部署到(没有父目录的service1的单个zip)中,因此出现错误Unable to import module 'main': attempted relative import with no known parent package

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

2 个答案:

答案 0 :(得分:1)

软件包src应当在根级别包含__init__.py文件,以表明它是软件包。然后,您可以使用绝对或相对路径从其他文件导入。绝对路径为

from src.service1.codebase.logger import configure_logger

但是在包含__init__.py文件之后,您的相对路径应该可以使用。

检查this answer以获得更多信息。

答案 1 :(得分:0)

在代码库/文件夹中将import os, sys; sys.path.append(os.path.dirname(os.path.realpath(__file__)))添加到__init__.py可以解决此问题。