Linux环境下导入PyQt4子模块失败问题求助
排查Ubuntu 16.04下PyQt4子模块无法导入的问题
这问题我之前帮不少开发者排查过,结合Ubuntu 16.04的系统特性和PyQt4的安装逻辑,大概率是以下几个原因导致的,你可以逐一验证:
1. 多Python版本导致的环境不匹配
Ubuntu 16.04默认自带Python 2.7和Python 3.5两个版本,很可能你给其中一个版本安装了PyQt4,但运行脚本时用的是另一个版本。比如:
- 你在全局Python 2.7里装了PyQt4,但脚本用Python 3运行,这时候虽然
import PyQt4可能因为某些巧合成功,但子模块肯定找不到; - 反过来也一样,Python 3装了PyQt4,脚本用Python 2跑也会出问题。
解决方法:
- 先确认当前脚本使用的Python版本:
python --version(如果是Python3就用python3 --version); - 查看PyQt4的安装路径是否匹配当前版本:
python -c "import PyQt4; print(PyQt4.__file__)"; - 如果版本不匹配,给对应版本安装PyQt4:
- Python 2:
sudo apt-get install python-pyqt4; - Python 3:
sudo apt-get install python3-pyqt4。
- Python 2:
2. PyQt4子模块未完整安装
Ubuntu的包管理器会把PyQt4的核心组件和部分特殊子模块拆分成独立的包。比如你只安装了基础的python-pyqt4,但脚本需要用到QtWebKit、QtSql这类子模块,就会出现导入失败。
解决方法:
- 先明确你需要导入的子模块名称,比如
PyQt4.QtWebKit; - 安装对应的子模块包,以Python2为例:
sudo apt-get install python-pyqt4.qtwebkit; - 如果不确定,也可以先彻底重装PyQt4确保组件完整:
Python3版本替换成sudo apt-get purge python-pyqt4 sudo apt-get install python-pyqt4python3-pyqt4即可。
3. 虚拟环境的依赖隔离问题
如果你是在虚拟环境中运行脚本,而PyQt4是安装在系统全局Python环境里的,虚拟环境默认会隔离全局包。这时候可能出现全局能导入PyQt4,但虚拟环境里只有部分组件可用的情况。
解决方法:
- 要么在虚拟环境内重新安装PyQt4(注意Ubuntu下虚拟环境装PyQt4建议用apt-get而非pip,pip的PyQt4包可能存在兼容性问题);
- 要么创建虚拟环境时加上
--system-site-packages参数,让虚拟环境继承全局的PyQt4包:virtualenv --system-site-packages myenv
4. 文件权限导致子模块无法读取
极少数情况下,PyQt4的子模块文件权限设置错误,导致当前用户无法读取。比如安装时用sudo但权限未正确继承,或者后续修改过权限。
解决方法:
- 找到PyQt4的安装路径(比如
/usr/lib/python2.7/dist-packages/PyQt4/); - 调整该目录下所有文件的权限:
注意替换路径为你实际的PyQt4安装目录。sudo chmod -R 755 /usr/lib/python2.7/dist-packages/PyQt4/
内容的提问来源于stack exchange,提问作者freedome97
相关产品推荐
相关产品推荐

