PyGame游戏引擎PyPI打包后图片加载失败及资源配置求助
解决PyGame引擎打包后资源文件加载问题
一、确认图片是否随包下载
首先检查你的打包配置文件(setup.py 或 pyproject.toml),必须确保data目录下的图片被包含进安装包:
1. 若使用setup.py
添加package_data配置,指定要包含的资源文件:
from setuptools import setup, find_packages setup( name="pyEngine2D", version="0.1.0", packages=find_packages(), # 配置包资源 package_data={ "pyEngine2D": ["data/*.png"] # 匹配data目录下所有png文件 }, include_package_data=True, # 其他依赖配置 install_requires=[ "pygame>=2.0.0" ] )
2. 若使用pyproject.toml
添加如下配置:
[tool.setuptools.package-data] pyEngine2D = ["data/*.png"] [tool.setuptools] include-package-data = true
配置完成后重新打包上传TestPyPI,安装后可前往Python的site-packages目录找到pyEngine2D/data,检查是否存在null.png,确认资源是否被正确打包。
二、修改图片加载代码
不能直接使用相对路径("pyEngine2D/data/null.png"),因为安装后包的位置不在当前工作目录,需要通过包的实际安装路径获取资源:
方法1:使用importlib.resources(Python 3.9+推荐)
修改ScreenInit类中的图标加载代码:
import importlib.resources import pygame class ScreenInit: def __init__(self, width, height, fps, scale, icon_path, title): self.icon = icon_path self.title = title # 其他初始化代码... if self.icon: # 通过包名和资源路径获取绝对路径 with importlib.resources.path("pyEngine2D", self.icon) as abs_icon_path: pygame_icon = pygame.image.load(str(abs_icon_path)) pygame.display.set_icon(pygame_icon)
调用时只需传资源相对于包的路径:
screen = ScreenInit(360, 480, 60, 100, "data/null.png", "MyGame")
方法2:使用pkg_resources(兼容旧Python版本)
确保已安装setuptools(一般默认已安装),然后修改代码:
import pkg_resources import pygame class ScreenInit: def __init__(self, width, height, fps, scale, icon_path, title): self.icon = icon_path self.title = title # 其他初始化代码... if self.icon: # 拼接包名和资源路径获取绝对路径 abs_icon_path = pkg_resources.resource_filename("pyEngine2D", self.icon) pygame_icon = pygame.image.load(abs_icon_path) pygame.display.set_icon(pygame_icon)
调用方式同样改为:
screen = ScreenInit(360, 480, 60, 100, "data/null.png", "MyGame")
三、额外检查
- 确保
data目录在pyEngine2D包的根目录下,目录结构正确:pyEngine2D/ ├── __init__.py ├── data/ │ └── null.png └── 其他模块文件... - 重新打包时先清理旧的构建文件(比如
build/、dist/、*.egg-info目录),避免缓存影响。
内容的提问来源于stack exchange,提问作者ddd makbema
相关产品推荐
相关产品推荐

