PyInstaller打包含pyfiglet字体的Python程序时字体缺失问题求助
解决PyInstaller打包pyfiglet字体缺失问题的方案
核心问题
PyInstaller默认不会自动打包pyfiglet的字体资源文件(.flf格式),这些文件不属于Python模块,因此打包后程序无法找到字体文件,导致FontNotFound或ModuleNotFoundError: pyfiglet.fonts错误。以下是几种可靠的解决方法:
方法1:直接用PyInstaller的--add-data参数打包字体目录
找到pyfiglet字体路径:
- 系统Python环境:路径通常为
C:\Python311\Lib\site-packages\pyfiglet\fonts - PyCharm虚拟环境:路径为
项目目录\venv\Lib\site-packages\pyfiglet\fonts
- 系统Python环境:路径通常为
执行打包命令:
pyinstaller --onefile --add-data "C:\Python311\Lib\site-packages\pyfiglet\fonts;pyfiglet/fonts" 你的脚本名.py--onefile:生成单个独立exe文件--add-data:将本地字体目录复制到打包后exe内部的pyfiglet/fonts路径(Windows下用分号分隔源路径和目标路径)
方法2:修改spec文件打包
生成spec文件:
pyi-makespec 你的脚本名.py编辑生成的
.spec文件:
在Analysis部分的datas列表中添加字体目录的映射:a = Analysis( ['你的脚本名.py'], pathex=[], binaries=[], datas=[('C:\\Python311\\Lib\\site-packages\\pyfiglet\\fonts', 'pyfiglet/fonts')], ... # 其他默认内容保留 )用spec文件打包:
pyinstaller 你的脚本名.spec
方法3:仅打包所需字体(减小exe体积)
如果只用到少数字体,无需打包整个字体目录:
- 将需要的字体文件(如
banner3-d.flf)复制到项目下的fonts文件夹 - 修改代码指定字体路径:
from pyfiglet import Figlet figlet = Figlet(font='./fonts/banner3-d.flf') - 执行打包命令:
pyinstaller --onefile --add-data "fonts/banner3-d.flf;fonts" 你的脚本名.py
方法4:适配打包后的运行路径
PyInstaller会在运行时将exe解压到临时目录,可通过sys._MEIPASS获取该路径,确保代码能正确找到字体:
import sys import os from pyfiglet import Figlet def get_font_path(font_name): if hasattr(sys, '_MEIPASS'): # 打包后运行时的字体路径 return os.path.join(sys._MEIPASS, 'pyfiglet', 'fonts', f'{font_name}.flf') else: # 本地开发时直接用字体名 return font_name # 使用示例 figlet = Figlet(font=get_font_path('banner3-d'))
搭配方法1的--add-data命令即可正常运行。
前置准备
确保依赖版本为最新,避免兼容性问题:
pip install --upgrade pyfiglet pyinstaller
内容的提问来源于stack exchange,提问作者Cooked.Coder
相关产品推荐
相关产品推荐

