Python3.11.4(MacOS13.4.1)pip install -e安装包时Numpy导入失败
问题:pip安装自定义包时构建环境无法导入Numpy
在MacOS 13.4.1 + Python 3.11.4环境下,执行pip3 install -e gemvms安装自定义包时,构建环境报错ModuleNotFoundError: No module named 'numpy',但本地交互式Python环境能正常导入Numpy。重装Python 3.11和Numpy后问题依旧,该包曾在Python 3.11.1环境用相同配置正常构建。
执行命令及报错信息
tlh:prog/python % pip3 install -e gemvms Obtaining file:///Users/tlh/prog/python/gemvms Installing build dependencies ... done Checking if build backend supports build_editable ... done Getting requirements to build editable ... error error: subprocess-exited-with-error × Getting requirements to build editable did not run successfully. │ exit code: 1 ╰─> [30 lines of output] /Users/tlh/prog/python/gemvms/gemvms/__init__.py:15: UserWarning: warn test warn("warn test") Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module> main() File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main json_out['return_val'] = hook(**hook_input['kwargs']) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 132, in get_requires_for_build_editable return hook(config_settings) ^^^^^^^^^^^^^^^^^^^^^ File "/private/var/folders/t9/tmj9gs9146jcqc1p0lh2c4bc000314/T/pip-build-env-tmurvx_a/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 450, in get_requires_for_build_editable return self.get_requires_for_build_wheel(config_settings) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/private/var/folders/t9/tmj9gs9146jcqc1p0lh2c4bc000314/T/pip-build-env-tmurvx_a/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 341, in get_requires_for_build_wheel return self._get_build_requires(config_settings, requirements=['wheel']) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/private/var/folders/t9/tmj9gs9146jcqc1p0lh2c4bc000314/T/pip-build-env-tmurvx_a/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 323, in _get_build_requires self.run_setup() File "/private/var/folders/t9/tmj9gs9146jcqc1p0lh2c4bc000314/T/pip-build-env-tmurvx_a/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 488, in run_setup self).run_setup(setup_script=setup_script) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/private/var/folders/t9/tmj9gs9146jcqc1p0lh2c4bc000314/T/pip-build-env-tmurvx_a/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 338, in run_setup exec(code, locals()) File "<string>", line 13, in <module> File "/Users/tlh/prog/python/gemvms/gemvms/__init__.py", line 19, in <module> from .data import VMSData File "/Users/tlh/prog/python/gemvms/gemvms/data.py", line 55, in <module> import numpy as np ModuleNotFoundError: No module named 'numpy' [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: subprocess-exited-with-error × Getting requirements to build editable did not run successfully. │ exit code: 1 ╰─> See above for output. note: This error originates from a subprocess, and is likely not a problem with pip.
原因分析
pip在安装包时会创建隔离的构建环境,这个环境和本地交互式Python的site-packages完全独立。报错是因为执行setup.py过程中,代码导入了包内的data.py模块,而该模块依赖numpy,但此时构建环境尚未安装numpy,因此触发导入错误。
解决方案
方案1:避免在构建阶段导入包内模块(推荐)
这是Python包开发的最佳实践,不要在setup.py执行时导入包内任何模块。比如如果setup.py是通过导入包来获取版本号,改成直接读取文件的方式:
# 替换setup.py中导入包的代码 with open("gemvms/__init__.py", "r", encoding="utf-8") as f: for line in f: if line.startswith("__version__"): __version__ = line.split("=")[1].strip().strip('"').strip("'") break
方案2:配置构建依赖,让pip提前安装numpy
在项目根目录创建pyproject.toml文件,添加以下内容,告知pip构建环境需要numpy:
[build-system] requires = ["setuptools", "wheel", "numpy"] build-backend = "setuptools.build_meta"
之后再执行pip3 install -e gemvms,pip会先在隔离构建环境中安装numpy,再执行构建流程。
方案3:临时禁用构建隔离(不推荐)
执行安装命令时加上--no-build-isolation参数,让pip直接使用当前Python环境的依赖:
pip3 install -e gemvms --no-build-isolation
注意:该方法会污染全局Python环境,可能导致依赖冲突,仅作为临时应急方案。
内容的提问来源于stack exchange,提问作者Thomas Hayward
相关产品推荐
相关产品推荐

