【问题标题】:Gitlab CI Python run test - ModuleNotFoundError: No module named xxxGitlab CI Python运行测试-ModuleNotFoundError:没有名为xxx的模块
【发布时间】:2018-09-01 15:59:04
【问题描述】:

我看到很多关于导入模块错误的问题,但我无法解决 Gitlab CI 管道的问题。

我的项目结构:

├───config
├───docs
├───src
    __init__.py
│   ├───dataset
        __init__.py
│   ├───exceptions
│   ├───resources
│   └───utils
        __init__.py
└───tests
    __init__.py
    └───resources
__init__.py

我想使用 pytest 运行测试。 我调用此命令python -m pytest -p no:cacheprovider 或使用 unittest 'python -m unittest discover -v' 从根目录并尝试从测试目录调用。在这两种情况下,我从数据集模块导入类都有问题。有趣的是,我有两个测试文件。

第一个文件导入:

import os import unittest

from src.utils.FileManager import FileManager

第二次进口:

from src.dataset.DatasetHelper import DatasetHelper

第一个文件通过但第二个文件失败并出现错误:

从数据集导入 DatasetHelper ModuleNotFoundError: No module 命名为“数据集”

所以问题是其他模块(如来自 src 的 utils)被正确导入,只有数据集有问题。我在这几天苦苦挣扎,我完全没有想法。我还尝试从 src.dataset 更改而不是从数据集更改。它没有用。我可以通过单击鼠标右键在 PyCharm 中运行测试,只运行测试,但不能在 CI 环境中运行。

我尝试了什么:

  • 向 $PYTHONPATH 添加模块,例如
    sys.path.insert(0, "/builds/USER/PROJECT/src/dataset") 
    sys.path.insert(0, "/builds/USER/PROJECT/src") 
    sys.path.insert(0, "/builds//USER/PROJECT/tests")
    

PYTHONPATH 添加前的内容为:

Current $PYTHONPATH: ['/builds/USER/PROJECT/config', '/usr/local/lib/python36.zip', '/usr/local/lib/python3.6', '/usr/local/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/site-packages']

列表中的第一个模块是 config,因为我从该目录运行脚本以将上述模块添加到路径。没用

  • 从根目录运行测试命令并添加前缀src 到测试目录中的导入。没有帮助

【问题讨论】:

  • 查看此问题,了解No module named 问题的不同解决方案:PATH issue with pytest 'ImportError: No module named YadaYadaYada'。你已经用不必要的__init__.py 文件破坏了你的项目,也不需要sys.path 操作。
  • 正确的做法是在您的 CI 中使用 setup.py 并使用 python setup.py develop。这将确保您的库已安装。

标签: python python-3.x pytest gitlab-ci


【解决方案1】:

从数据集导入 DatasetHelper
ModuleNotFoundError: 没有名为“数据集”的模块

src.__init__ 或更可能在src.dataset.__init__ 中都有导入语句from dataset import DatasetHelper。您必须将其重写为from src.dataset import…

【讨论】:

    【解决方案2】:

    您可以尝试在 tests 目录内的 __init__.py 文件中使用相对导入。

    语法取决于当前位置以及您尝试导入的模块、包或对象的当前位置。以下是一些示例:

    from .some_module import some_class
    from ..some_package import some_function
    from . import some_class
    

    来源:https://realpython.com/absolute-vs-relative-python-imports/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2020-11-20
      • 2021-03-09
      相关资源
      最近更新 更多