当前位置: 首页 > news >正文

Python 打包时包含字库文件的方法

在 Python 打包时,如果你想将字库文件(如 .ttf、.otf 等字体文件)一起打包成一个可执行文件,有几种常见的方法,具体取决于你使用的打包工具。

使用 PyInstaller

PyInstaller 是最常用的打包工具之一,以下是包含字库文件的方法:

 1. 基本方法 - 使用 --add-data 参数:

pyinstaller --onefile --add-data="font.ttf;." your_script.py

多个:

pyinstaller --onefile --add-data="font1.ttf:." --add-data="font2.ttf:." --add-data="fonts/font3.otf:fonts/" your_script.py
  1. 使用 spec 文件(更推荐的方法):

    • 首先生成 spec 文件:pyi-makespec your_script.py

    • 然后修改 spec 文件,在 a.datas 中添加字体文件:

 

a = Analysis(['your_script.py'],binaries=[],datas=[('font.ttf', '.')],  # 添加这行...
)

添加多个文件

a = Analysis(['your_script.py'],binaries=[],datas=[('font1.ttf', '.'),('font2.ttf', '.'),('fonts/font3.otf', 'fonts'),  # 保持目录结构('fonts/font4.ttf', 'fonts'),],...
)

需要在代码中处理字体路径

import os
import sysdef resource_path(relative_path):""" 获取资源的绝对路径 """if hasattr(sys, '_MEIPASS'):return os.path.join(sys._MEIPASS, relative_path)return os.path.join(os.path.abspath("."), relative_path)# 使用示例
font_path = resource_path("font.ttf")

注意事项

  1. 确保在代码中正确引用字体文件路径(使用上述的 resource_path 方法)

  2. 字体文件较大的话,打包后的文件体积会显著增加

  3. 测试打包后的程序是否能正确加载字体

  4. 考虑字体文件的许可证问题,确保你有权分发该字体

选择哪种方法取决于你的具体需求和使用的打包工具。PyInstaller 通常是跨平台打包的最佳选择。

批量添加字体文件夹

import glob# 获取所有字体文件
font_files = glob.glob('fonts/*.ttf') + glob.glob('fonts/*.otf')a = Analysis(['your_script.py'],binaries=[],datas=[(font, 'fonts') for font in font_files],...
)

注意事项

  1. 保持文件目录结构一致,特别是在代码中引用字体时

  2. 检查字体文件的许可证,确保可以合法分发

  3. 大量字体文件会显著增加打包后的体积

  4. 测试打包后的程序能否正确找到并加载所有字体

  5. 考虑使用相对路径而不是绝对路径引用字体文件

选择哪种方法取决于你的项目需求和使用的打包工具。对于大多数情况,PyInstaller 的 spec 文件方式提供了最好的灵活性和可维护性。

4. 使用 spec 文件打包

pyinstaller your_script.spec

5.在代码中访问打包后的字体文件

import os
import sys
from pathlib import Pathdef resource_path(relative_path):""" 获取打包后资源的绝对路径 """if hasattr(sys, '_MEIPASS'):base_path = Path(sys._MEIPASS)else:base_path = Path.cwd()return str(base_path / relative_path)# 使用示例
font_path = resource_path('fonts/NotoSans-Regular.ttf')# 使用字体(以Pillow为例)
from PIL import ImageFont
try:font = ImageFont.truetype(font_path, size=12)
except IOError:print(f"无法加载字体文件: {font_path}")font = ImageFont.load_default()

相关文章:

  • 信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(十三)(1)
  • 安科瑞光伏综自系统在新能源电站中的应用及调度上传方案研究
  • 攻防演练 | 关于蓝队攻击研判的3大要点解读
  • Rust 智能指针全解析:从原理到实践
  • rust 中的 EBNF 介绍
  • 深入理解 Linux 虚拟文件系统(VFS)
  • 国联股份卫多多与北京经纬智诚签署战略合作协议
  • YOLO数据集标注工具LabelImg(打包Exe版本及使用)
  • redhat9 安装pywinrm
  • 解锁健康养生新境界
  • 范式之殇-关系代数与参照完整性在 Web 后台的落寞
  • vLLM部署Qwen2-7B模型推理
  • 基于SSM + JSP 的个人通讯录管理系统
  • 深度学习-161-Dify工具之对比使用工作流和聊天流生成图表可视化的html文件
  • RT-Thread 深入系列 Part 2:RT-Thread 内核核心机制深度剖析
  • eNSP中路由器RIP协议配置完整实验实验和命令解释
  • AI赋能智能客服革新:R²AIN SUITE 如何破解医疗行业服务难题?
  • 【250GB空间不够用】
  • isp流程介绍(yuv格式阶段)
  • Linux系统Shell脚本之sed
  • 巴总理召开国家指挥当局紧急会议
  • 19个剧团15台演出,上海民营院团尝试文旅融合新探索
  • “浦东时刻”在京展出:沉浸式体验海派风情
  • 新华每日电讯:给“男性妇科病论文”开一剂复方药
  • 泽连斯基称与特朗普通话讨论停火事宜
  • 西南大学教授、重庆健美运动奠基人之一李启圣逝世