当前位置: 代码网 > it编程>前端脚本>Python > Python打包时包含字库文件的几种常见方法

Python打包时包含字库文件的几种常见方法

2025年05月12日 Python 我要评论
前言在 python 打包时,如果你想将字库文件(如 .ttf、.otf 等字体文件)一起打包成一个可执行文件,有几种常见的方法,具体取决于你使用的打包工具。使用 pyinstallerpyinsta

前言

在 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

2. 使用 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 sys

def 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")

注意事项

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

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

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

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

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

3. 批量添加字体文件夹

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],
    ...
)

注意事项

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

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

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

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

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

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

4. 使用 spec 文件打包

pyinstaller your_script.spec

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

import os
import sys
from pathlib import path

def 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()

总结 

到此这篇关于python打包时包含字库文件的几种常见方法的文章就介绍到这了,更多相关python打包包含字库文件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com