Gitlab CI Python运行测试-ModuleNotFoundError:没有名为xxx的模块

Posted

技术标签:

【中文标题】Gitlab CI Python运行测试-ModuleNotFoundError:没有名为xxx的模块【英文标题】:Gitlab CI Python run test - ModuleNotFoundError: No module named 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。这将确保您的库已安装。 【参考方案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/

【讨论】:

以上是关于Gitlab CI Python运行测试-ModuleNotFoundError:没有名为xxx的模块的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Gitlab CI 运行 Cypress 测试

在 .gitlab.ci.yml 中并行运行作业

在 Gitlab CI 中运行硒测试

gitlab-ci.yaml:在多行 python docker 镜像中运行 python

构建后的测试将在 gitlab-ci 上的新环境中运行

使用 Testcontainers 执行运行集成测试的 Gitlab CI 管道作业时出现问题