Python中如何使用相对路径加载图标 适配可共享包场景
问题原因
你使用的相对路径是相对于Python进程的运行工作目录,而非qtprogram.py文件所在的目录,因此当你在其他目录运行主脚本时,路径定位就会失效。
解决方案
方案1:基于__file__变量拼接路径(兼容性最好)
该方案兼容所有Python版本,直接通过当前脚本文件的绝对路径定位同包内的资源:
import os from PyQt5 import QtGui # 根据你的PyQt版本调整导入 # 获取当前qtprogram.py文件所在的绝对目录 current_script_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接icon的绝对路径,自动适配不同操作系统的路径分隔符 icon_full_path = os.path.join(current_script_dir, "resource", "icon.png") # 加载图标 icon = QtGui.QIcon(icon_full_path)
方案2:使用importlib.resources(Python 3.9+,更符合包分发规范)
该方案是Python官方推荐的包内资源访问方式,就算包被打包为压缩格式也能正常读取资源,避免路径拼接错误:
from importlib.resources import files from PyQt5 import QtGui # 定位mypackage.resource包下的icon.png icon_path = files("mypackage.resource").joinpath("icon.png") icon = QtGui.QIcon(str(icon_path))
分发注意事项
打包你的包时需要确保resource目录被包含在发布文件中,可通过如下配置实现:
- 如果使用
pyproject.toml,添加配置项include-package-data = true - 如果使用
setup.py,添加参数include_package_data=True - 新增
MANIFEST.in文件,写入recursive-include mypackage/resource *.png,明确指定要打包的资源文件
内容的提问来源于stack exchange,提问作者Drimer
相关产品推荐
相关产品推荐

