使用pyenv时无法安装部分Python包的问题求助
我在使用pyenv时遇到了包安装失败的问题,具体表现为安装新包时无法找到已安装的模块。例如,我通过pyenv activate xxx激活Python 3.8.19的虚拟环境后,执行pip install vamp命令安装vamp包,明明已经安装了numpy,却出现如下错误:
Collecting vamp Using cached vamp-1.1.0.tar.gz (107 kB) Installing build dependencies ... done Getting requirements to build wheel ... error error: subprocess-exited-with-error × Getting requirements to build wheel did not run successfully. │ exit code: 1 ╰─> [17 lines of output] Traceback (most recent call last): File "/home/USER_NAME/.pyenv/versions/3.8.19/envs/ENV_NAME/lib/python3.8/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module> main() File "/home/USER_NAME/.pyenv/versions/3.8.19/envs/ENV_NAME/lib/python3.8/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main json_out['return_val'] = hook(**hook_input['kwargs']) File "/home/USER_NAME/.pyenv/versions/3.8.19/envs/ENV_NAME/lib/python3.8/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 118, in get_requires_for_build_wheel return hook(config_settings) File "/tmp/pip-build-env-12igiyji/overlay/lib/python3.8/site-packages/setuptools/build_meta.py", line 325, in get_requires_for_build_wheel return self._get_build_requires(config_settings, requirements=['wheel']) File "/tmp/pip-build-env-12igiyji/overlay/lib/python3.8/site-packages/setuptools/build_meta.py", line 295, in _get_build_requires self.run_setup() File "/tmp/pip-build-env-12igiyji/overlay/lib/python3.8/site-packages/setuptools/build_meta.py", line 487, in run_setup super().run_setup(setup_script=setup_script) File "/tmp/pip-build-env-12igiyji/overlay/lib/python3.8/site-packages/setuptools/build_meta.py", line 311, in run_setup exec(code, locals()) File "<string>", line 3, in <module> 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 wheel 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.
使用pyenv shell 3.8.19代替虚拟环境激活时,也会出现相同现象。此外,安装omnizart、madmom、natten等其他包时,也会遇到此类错误。
这类问题的核心原因是:pip在构建包的wheel时默认会创建隔离的临时构建环境,这个环境不会继承当前环境已安装的依赖包;而部分包(比如vamp)的setup.py会直接导入numpy等依赖来执行构建逻辑,导致构建阶段找不到已安装的模块。
以下是几种可行的解决方法:
1. 关闭构建环境隔离
直接让pip在当前环境中构建包,跳过临时隔离环境,这样就能使用已安装的依赖:
pip install vamp --no-build-isolation
这个方法适用于大部分此类场景,对omnizart、madmom等包同样有效。
2. 指定构建阶段依赖
如果不想关闭隔离环境,可以提前告知pip构建该包需要的依赖,让临时环境自动安装:
pip install vamp --config-settings=setup-requires=numpy
对于较旧版本的pip(<21.3),可以使用--build-option参数:
pip install vamp --build-option="--setup-requires=numpy"
3. 确认pyenv环境激活正常
先检查当前环境的pip是否属于目标pyenv环境:
which pip
正常情况下,虚拟环境应该输出~/.pyenv/versions/3.8.19/envs/ENV_NAME/bin/pip,pyenv shell环境应该输出~/.pyenv/versions/3.8.19/bin/pip。如果路径不对,重新激活环境并检查PATH:
echo $PATH
确保pyenv对应的bin目录在PATH最前端。
4. 升级pip和构建工具
旧版本的pip、setuptools可能存在构建环境处理的bug,先升级到最新版本:
pip install --upgrade pip setuptools wheel
内容的提问来源于stack exchange,提问作者S. Yong

