背景

本站的这篇博客、分享了一同时支持Windows/Mac/Linux的图片批量添加水印并压缩的工具,里面用到了pyinstaller技术来分别打包出来支持3个平台的程序,由于代码依赖一个静态字体文件,当时用了以下命令打包来进行的打包:

pyinstaller –onefile –nowindow –add-data=”arial.ttf:.” image_helper.py

意思是把arial.ttf这个静态字体文打包进当前目录,而代码里面调用的路径也是当前目录,可是在运行的时候却出现了如下报错:

OSError: cannot open resource

如何彻底解决Pyinstaller打包后的程序识别不到静态文件</a />

我们打开报错的第132行看看,如下:

如何彻底解决Pyinstaller打包后的程序识别不到静态文件

碎碎念

用“pyinstaller OSError: cannot open resource”为关键字搜索不管是百度还是谷歌,搜出来的结果都是要你折腾系统字体,比如下面的这种:

如何彻底解决Pyinstaller打包后的程序识别不到静态文件

你是开发者你当然知道怎么折腾字体,但你把你打包好的程序交付给一个普通用户去使用,也要指望用户会这些骚操作么,当然不行呀。

解决方法

下面的方法只需改动两三行代码即可让打包好的程序在任意系统下均不依赖系统字体独立运行,彻底解决上面的报错。

[$]

其实很简单,把上面截图的第二张中的131和132行代码替换为下面的3行即可解决问题:

bundle_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__)))
path_to_ttf = os.path.abspath(os.path.join(bundle_dir, 'arial.ttf'))
ttfront = ImageFont.truetype(path_to_ttf, self.font_size)

注意前面要import os 和 sys这两个标准库哦~

至于应用到你自己的代码的时候,请举一反三哈~

[/$]