【问题标题】:python pytest importing modules which import local modules导入本地模块的python pytest导入模块
【发布时间】:2023-04-05 20:34:01
【问题描述】:

我有以下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 in service1 我正在从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

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

【问题讨论】:

  • 你试过from src.service1.codebase.logger import configure_logger吗?
  • 您还好像在包的根目录中缺少__init__.py 文件?

标签: python pytest


【解决方案1】:

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

from src.service1.codebase.logger import configure_logger

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

查看this answer了解更多信息。

【讨论】:

  • 谢谢 - 但是最终的 zip 文件中不存在 src。本质上,最后,实际部署的唯一文件是每个服务中的 /codebase 文件夹内容,因此在部署时它不会知道任何关于 src(甚至 codebase 文件夹)文件路径的信息,这就是它需要保留的原因import x from y 如果可能的话 - 也许我需要将我的测试移动到它们各自的服务文件夹中?
  • 您应该在答案中包含此信息...无论如何,这可能是 python 路径的 IDE 配置问题。
【解决方案2】:

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

【讨论】:

  • 谢谢,这对我有用。你能解释一下为什么添加东西 sys.path 会使导入正确吗?
  • @XavierSilva,它通过将包/目录名称添加到您的路径来工作。因此,可以访问和导入该包中的任何模块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2020-02-02
  • 2018-07-19
  • 1970-01-01
  • 2017-06-04
  • 2012-11-11
相关资源
最近更新 更多