如何让pyenv安装的Python调用apt-get安装的PyQt5包?
问题:树莓派Bookworm下pyenv安装的Python调用PyQt5失败
背景
在树莓派OS 12 Bookworm系统中,通过pyenv安装了较新版本的Python,希望:
- 用
apt install安装PyQt5并让该Python版本调用 - 或通过pip安装PyQt5,但安装失败,报错信息如下:
Collecting pyqt5 Using cached PyQt5-5.15.11.tar.gz (3.2 MB) Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... error error: subprocess-exited-with-error × Preparing metadata (pyproject.toml) did not run successfully. │ exit code: 1 ╰─> [26 lines of output] pyproject.toml: line 14: the legacy use of 'license' is deprecated and will be removed in SIP v7.0.0, use an SPDX license expression and 'license-files' instead Traceback (most recent call last): File "/home/meca-vision/Documents/VisionClean4-repository/2visionclean-env2/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module> main() File "/home/meca-vision/Documents/VisionClean4-repository/2visionclean-env2/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 "/home/meca-vision/Documents/VisionClean4-repository/2visionclean-env2/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 152, in prepare_metadata_for_build_wheel whl_basename = backend.build_wheel(metadata_directory, config_settings) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/tmp/pip-build-env-lhigqra4/overlay/lib/python3.11/site-packages/sipbuild/api.py", line 28, in build_wheel project = AbstractProject.bootstrap('wheel', ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/tmp/pip-build-env-lhigqra4/overlay/lib/python3.11/site-packages/sipbuild/abstract_project.py", line 74, in bootstrap project.setup(pyproject, tool, tool_description) File "/tmp/pip-build-env-lhigqra4/overlay/lib/python3.11/site-packages/sipbuild/project.py", line 633, in setup self.apply_user_defaults(tool) File "/tmp/pip-install-wi408778/pyqt5_6eae56fded3d4c2eb48fdd123619bf15/project.py", line 68, in apply_user_defaults super().apply_user_defaults(tool) File "/tmp/pip-build-env-lhigqra4/overlay/lib/python3.11/site-packages/pyqtbuild/project.py", line 51, in apply_user_defaults super().apply_user_defaults(tool) File "/tmp/pip-build-env-lhigqra4/overlay/lib/python3.11/site-packages/sipbuild/project.py", line 243, in apply_user_defaults self.builder.apply_user_defaults(tool) File "/tmp/pip-build-env-lhigqra4/overlay/lib/python3.11/site-packages/pyqtbuild/builder.py", line 49, in apply_user_defaults raise PyProjectOptionException('qmake', sipbuild.pyproject.PyProjectOptionException [end of output]
目标是用pyenv的Python创建带--system-site-packages的虚拟环境,共享系统apt安装的PyQt5,但apt仅识别系统自带旧版Python,想知道当前是否有可行方案。
解决方案
方案1:修复pip安装PyQt5的报错
报错核心是缺少Qt编译依赖,以及SIP版本兼容性问题,按以下步骤操作:
- 安装Qt5开发工具和依赖:
sudo apt install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools - 确保pyenv的Python安装了完整编译依赖(如果之前编译Python时未装全):
sudo apt install build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python3-openssl git - 指定兼容的SIP版本安装PyQt5(避开SIP v7的兼容性问题):
pip install sip<7 PyQt5
方案2:让pyenv Python调用apt安装的PyQt5
仅当pyenv安装的Python与系统Python主版本号一致(比如都是3.11)时可行:
- 创建虚拟环境时启用系统site-packages共享:
python -m venv --system-site-packages my-venv - 如果虚拟环境未自动识别系统包,手动添加系统site-packages路径:
- 找到系统PyQt5的安装路径,通常是
/usr/lib/python3/dist-packages - 在pyenv Python的site-packages目录下创建
.pth文件:echo "/usr/lib/python3/dist-packages" >> ~/.pyenv/versions/[你的Python版本]/lib/python[主版本号]/site-packages/system-packages.pth
[你的Python版本]和[主版本号]为实际值(比如3.11.6和3.11) - 找到系统PyQt5的安装路径,通常是
关键说明
- 若pyenv Python与系统Python主版本不同(比如系统是3.11,pyenv是3.12),无法共享apt安装的PyQt5——因为PyQt5是编译型扩展,与Python版本强绑定,跨版本无法调用,只能用方案1通过pip安装对应版本。
- 8年前的“不可行”结论主要针对跨主版本的情况,同主版本下现在已可通过上述方法实现。
内容的提问来源于stack exchange,提问作者JackOA
相关产品推荐
相关产品推荐

