自定义Python包安装问题:含OCR用位图资源无法正常引入
我之前也碰到过类似的情况——明明在MANIFEST.in里加了资源文件,安装后却找不到。结合你的目录结构和配置,问题主要出在setup.py的包数据配置上,以下是具体的解决步骤:
1. 完善setup.py的包数据配置
find_packages()默认只会识别.py文件,要让安装程序把位图这类资源也打包进去,需要在setup()函数里明确配置package_data,同时开启include_package_data=True:
from setuptools import setup, find_packages setup( # 你的其他配置项(比如name、version、author等) packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*"]), # 指定要包含的包资源 package_data={ "mypackage": ["media/*.bmp"] # 匹配mypackage/media下所有bmp文件 }, # 让setuptools自动处理MANIFEST.in和package_data的配置 include_package_data=True, )
这里的package_data是一个字典,键是你的包名(mypackage),值是该包下需要包含的文件路径模式,用通配符可以更灵活地匹配同类型文件。
2. 确认MANIFEST.in的正确性
你的MANIFEST.in内容是include mypackage/media/template.bmp,这个路径是对的(相对于setup.py所在的根目录),如果想匹配该目录下所有位图,也可以改成:
include mypackage/media/*.bmp
不过要注意,只有在setup.py里设置了include_package_data=True时,MANIFEST.in里的配置才会被安装程序采纳,否则即使写了也不会生效。
3. 用正确的方式读取包内资源
就算资源文件被正确安装了,如果在module1.py里用相对路径读取(比如./media/template.bmp),在包被安装到site-packages后大概率会找不到文件。推荐用Python标准库的importlib.resources(Python 3.7+)来安全读取资源:
# 在module1.py中读取template.bmp from importlib.resources import read_binary, files # 如果需要二进制内容 template_bytes = read_binary("mypackage.media", "template.bmp") # 如果需要文件路径 template_file_path = files("mypackage.media").joinpath("template.bmp")
如果你需要兼容Python 3.6及以下版本,可以用pkg_resources:
import pkg_resources template_path = pkg_resources.resource_filename("mypackage", "media/template.bmp")
4. 验证安装结果
安装包后,可以去Python的site-packages目录下找到mypackage,检查media文件夹里是否存在template.bmp;或者用pip show mypackage查看安装路径,再手动确认文件是否存在。
内容的提问来源于stack exchange,提问作者user3170354

