You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pillow+Code128生成条码转exe后触发OSError:无法打开资源

PyInstaller打包后生成Code128条码报OSError: cannot open resource的解决方法

问题背景

我用Python开发了生成Code128条码并合成图片的程序,VS Code直接运行正常,但用PyInstaller打包成.exe后,执行到barcode_origin.save()时触发OSError: cannot open resource。尝试过加载默认字体、用--add-data打包ARIAL.ttf、简化测试代码,问题依然存在。

核心原因

报错根源是python-barcode库的ImageWriter在生成条码文本时,默认使用的字体路径在打包后的exe环境中无法访问——这和你自己代码里加载的large_font无关,是条码库内部的字体加载逻辑出了问题。


解决方案

步骤1:修改代码,适配打包后的字体路径

添加路径适配函数,给ImageWriter显式指定打包后可访问的字体文件,同时兼容PyInstaller的临时目录(onefile模式下,exe运行时会把资源解压到sys._MEIPASS目录)。

修改核心代码中的条码生成逻辑:

import sys
import os
from barcode.writer import ImageWriter

def get_resource_path(relative_path):
    # 适配PyInstaller打包/未打包两种环境的路径
    try:
        base_path = sys._MEIPASS  # 打包后的临时资源目录
    except Exception:
        base_path = os.path.abspath(".")  # 未打包时的本地路径
    return os.path.join(base_path, relative_path)

# 生成origin条码的示例(其他条码生成部分同理修改)
writer = ImageWriter()
writer.font_path = get_resource_path("ARIAL.ttf")  # 指定字体路径
barcode_origin = Code128(self.current_origin, writer=writer)
barcode_origin.save("barcode_origin")

测试简化代码同步修改:

import sys
import os
import barcode
from barcode.writer import ImageWriter

def get_resource_path(relative_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

def generate_barcode(code, filename):
    code128 = barcode.get_barcode_class('code128')
    writer = ImageWriter()
    writer.font_path = get_resource_path("ARIAL.ttf")
    barcode_instance = code128(code, writer=writer)
    barcode_instance.save(filename)

generate_barcode('123456789', 'barcode.png')

步骤2:调整PyInstaller打包命令

确保字体文件被正确打包到exe的资源目录,注意Windows下用;分隔源路径和目标路径:

pyinstaller --noconfirm --onefile --console --add-data "C:/Users/RaulV/Desktop/Barcodes/ARIAL.ttf;." "C:/Users/RaulV/Desktop/Barcodes/combinedApp.py"

这里的.;表示把字体文件打包后放在exe解压后的根目录,和代码里get_resource_path("ARIAL.ttf")的路径对应。


额外注意事项

  • 保持字体文件名大小写一致:代码里用ARIAL.ttf,打包命令里的源文件路径也要对应(如果实际是arial.ttf要统一)
  • 不要依赖系统字体:打包后的exe在其他机器上可能没有你本地的ARIAL.ttf,必须把字体文件一起打包
  • 调试时可打印get_resource_path("ARIAL.ttf")的结果,确认路径是否正确

内容的提问来源于stack exchange,提问作者raúl vaquerizo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 00:07:04