Github Actions 构建 Python 包找不到 Numpy 模块?两种解决方案详解
2024-10-10 21:14:26
在 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 模块”的问题。如果你有任何疑问或建议,欢迎在评论区留言。