返回

Github Actions 构建 Python 包找不到 Numpy 模块?两种解决方案详解

python

在 Github Actions 中构建 Python 包时,你可能会遇到“ModuleNotFoundError: No module named 'numpy'” 的错误,即使你已经在 requirements.txt 文件中列出了 numpy,甚至在 setup.py 中导入了它。这个问题可能会让人摸不着头脑,尤其是在几个月前一切运行正常的情况下。本文将深入探讨这个问题的根源,并提供两种有效的解决方案,帮助你顺利构建 Python 包。

问题分析

这个问题的本质是 pip 在安装依赖项和构建 Python 包时使用了不同的环境。通常情况下,Github Actions workflow 会使用 actions/setup-python 来设置 Python 环境。随后,你使用 pip 安装项目所需的依赖项,包括 numpy。

但是,当你使用 pip install -e . 命令以可编辑模式安装包时,pip 会创建一个新的构建环境。这个环境与之前安装 numpy 的环境是隔离的,导致构建过程中找不到 numpy。

解决方案

为了解决这个问题,我们需要确保构建环境也能访问到 numpy。以下提供两种解决方案:

1. 在构建环境中安装 numpy

最直接的方法是在构建环境中也安装 numpy。你可以在 pip install -e . 命令之前,添加 pip install numpy 命令,如下所示:

- name: Build and test
  run: |
    python -m pip install numpy
    python -m pip install -e .
    python -c "import your_package" 

这种方法简单易行,可以快速解决问题。但是,它也存在一些不足:

  • 重复安装: 如果你的项目有很多依赖项,每次构建都需要重新安装所有依赖项,这会增加构建时间。
  • 环境不一致: 如果你的项目对 numpy 的版本有特定要求,这种方法可能导致构建环境中的 numpy 版本与项目实际使用的版本不一致。

2. 使用 setup.py 指定依赖项

更优雅的解决方案是在 setup.py 文件中明确指定项目所需的依赖项,包括 numpy。这样,pip 在构建环境中会自动安装这些依赖项。

首先,在 setup.py 文件中添加 install_requires 参数,列出项目所需的依赖项:

from setuptools import setup, find_packages

setup(
    # ... other parameters ...
    install_requires=[
        'numpy',
        # ... other dependencies ...
    ],
    # ... other parameters ...
)

然后,在 Github Actions workflow 中,将 pip install -r requirements.txt 命令替换为 pip install . 命令,如下所示:

- name: Install dependencies
  run: |
    python -m pip install --upgrade pip
    python -m pip install .

这种方法避免了重复安装,并确保构建环境中的依赖项与项目实际使用的依赖项一致,是更推荐的做法。

常见问题解答

1. 为什么我的项目在本地运行正常,但在 Github Actions 中却报错?

这可能是因为你的本地环境已经安装了 numpy,而 Github Actions 的构建环境是一个干净的环境,没有预装 numpy。

2. 如何确定我的项目所需的 numpy 版本?

你可以查看 requirements.txt 文件或 setup.py 文件中的 install_requires 参数。

3. 除了 numpy 之外,我还需要在 setup.py 中指定其他依赖项吗?

是的,你需要在 setup.py 中指定所有项目所需的依赖项,这样 pip 才能在构建环境中正确安装它们。

4. 如果我的项目依赖项之间存在版本冲突怎么办?

你可以使用 pip-tools 等工具来管理依赖项,并解决版本冲突问题。

5. 如何避免在 Github Actions 中重复安装依赖项?

你可以使用 Github Actions 的缓存功能来缓存依赖项,避免每次构建都重新安装。

希望本文能帮助你解决在 Github Actions 中构建 Python 包时遇到的“找不到 numpy 模块”的问题。如果你有任何疑问或建议,欢迎在评论区留言。