Python如何使用已安装包额外数据:PyQt图片显示问题
解决PyQt应用安装后无法加载package_data图片的问题
嘿,我之前碰到过完全一样的坑!你的推测一点没错——相对路径在包安装后根本行不通,因为程序运行时的工作目录和包的实际安装目录完全是两个地方,用images/foo.jpeg这种相对路径,程序会从你启动命令的当前目录找图片,而不是包的images文件夹。
下面是我亲测有效的解决步骤:
1. 确认包结构与setup.py配置
首先确保你的包结构是标准的,比如:
mypackage/ __init__.py your_main_script.py images/ foo.jpeg bar.png
然后检查setup.py里的package_data配置是否正确(不用MANIFEST.in的话,setuptools会自动处理这些资源):
from setuptools import setup, find_packages setup( name="mypackage", version="0.1", packages=find_packages(), package_data={ # 这里的键是你的包名,值是要包含的资源路径(相对于包根目录) "mypackage": ["images/*.jpeg", "images/*.png"] }, )
2. 用pkg_resources获取图片的绝对路径
在Python 2.7里,我们可以用pkg_resources(setuptools自带的工具)来获取包内资源的绝对安装路径,替换掉原来的相对路径。
修改你的PyQt代码:
import pkg_resources from PyQt4.QtGui import QPixmap, QLabel # 获取图片的绝对路径:第一个参数是包名,第二个是资源相对于包根的路径 image_path = pkg_resources.resource_filename("mypackage", "images/foo.jpeg") # 加载图片 pixmap = QPixmap(image_path) label = QLabel() label.setPixmap(pixmap)
3. 为什么这个方法有效?
pkg_resources.resource_filename会自动定位到包在site-packages里的实际安装目录,比如你提到的/usr/local/lib/python2.7/dist-packages/mypackage/images/foo.jpeg,这样不管你从哪个目录启动应用,都能准确找到图片文件。
额外注意点
- 确保你的Python环境里安装了
setuptools(Python 2.7默认可能有,但如果没有的话用pip install setuptools安装); - 如果是用QIcon加载图标,方法完全一样,把
QPixmap换成QIcon即可; - 测试的时候,可以先打印
image_path的值,确认路径是否正确,方便排查问题。
内容的提问来源于stack exchange,提问作者Elad Weiss
相关产品推荐
相关产品推荐

