GitLab CI中运行pytest触发ImportError问题求助
解决Python包CI测试时的PackageNotFoundError问题
本地运行正常是因为你可能已经通过pip install -e .安装了包的开发版,Python环境中存在包的元数据;但CI环境仅拉取代码未安装包,importlib.metadata.version("bar-pack")无法找到已安装包的元数据,因此报错。
以下是几种可行的解决方案:
方案1:CI流程中先安装包(推荐)
在.gitlab-ci.yml的测试阶段,先执行包的安装命令,确保环境中存在包元数据:
test: stage: test script: - pip install -e . # 安装开发版,本地代码修改后无需重新安装 - pytest bar-pack/test -v
如果不需要开发模式,也可以用pip install .安装正式版。
方案2:修改__init__.py,不依赖已安装元数据获取版本
方法A:硬编码版本号
直接在bar-pack/__init__.py中写死版本号,简单直接:
# bar-pack/__init__.py __version__ = "0.1.0" # 根据实际版本修改
方法B:从setup.py读取版本号
如果版本号定义在setup.py中,可以通过读取文件内容提取:
# bar-pack/__init__.py from pathlib import Path import re def get_package_version(): setup_file = Path(__file__).parent.parent / "setup.py" with open(setup_file, encoding="utf-8") as f: setup_content = f.read() version_match = re.search(r'version\s*=\s*[\'"]([^\'"]+)[\'"]', setup_content) return version_match.group(1) if version_match else "unknown" __version__ = get_package_version()
方法C:用setuptools-scm自动管理版本
如果用git标签管理版本,可借助setuptools-scm工具自动从git标签生成版本:
- 先在setup.py中配置setuptools-scm:
# setup.py from setuptools import setup setup( # 其他配置项... use_scm_version=True, setup_requires=["setuptools-scm"], )
- 修改
bar-pack/__init__.py:
# bar-pack/__init__.py from setuptools_scm import get_version __version__ = get_version(root="..", relative_to=__file__)
内容的提问来源于stack exchange,提问作者elj96
相关产品推荐
相关产品推荐

