Python转exe后生成带条形码Word文档打印报OSError错误
解决auto-py-to-exe打包后生成条形码Word并打印时的OSError问题
问题根源
开发环境(Jupyter/Anaconda)依赖系统已安装的条形码字体或本地资源,但auto-py-to-exe打包后的exe是独立运行环境,默认不会包含这些外部资源,导致程序运行时找不到字体文件触发OSError: cannot open resource。
解决方案
1. 定位并准备条形码字体文件
- 确认你程序生成条形码时使用的字体(比如
Free 3 of 9、Code 128等),找到对应的.ttf字体文件。 - 将字体文件放到你的Python脚本同目录下。
2. 修改代码动态获取资源路径
打包后exe会将资源临时解压到sys._MEIPASS目录,添加路径处理函数来兼容开发和打包环境:
import sys import os 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)
3. 代码中指定字体路径
根据你使用的条形码生成库,修改代码明确指向字体文件:
示例(python-barcode库)
import barcode from barcode.writer import ImageWriter # 获取字体路径 font_path = get_resource_path("free3of9.ttf") # 设置写入器选项 writer_options = { "font_path": font_path, "font_size": 12, "text_distance": 1.5 } # 生成条形码 code = barcode.get("code128", "YOUR_BARCODE_DATA", writer=ImageWriter()) code.save("barcode_img", options=writer_options)
示例(python-docx直接生成条形码文本)
如果是通过Word字体直接生成条形码文本,需嵌入字体并指定路径:
from docx import Document from docx.shared import Pt doc = Document() para = doc.add_paragraph() run = para.add_run("*YOUR_BARCODE_DATA*") # 部分条形码字体需要前后加* # 设置字体 font = run.font font.name = "Free 3 of 9" font.size = Pt(24) font.embed = True # 嵌入字体到Word文档 # 保存文档 doc.save("barcode_doc.docx")
4. 配置auto-py-to-exe打包资源
打开auto-py-to-exe:
- 在Additional Files区域,点击
Add Files,选择你准备的字体文件。 - 确保打包模式选择
One Directory或One File(如果选One File,资源会被打包进exe,运行时自动解压)。 - 重新打包生成exe。
5. 验证打印流程
打包后运行exe,生成Word文档后,确认条形码正常显示,再测试打印功能。如果仍有问题,检查打印时是否调用了系统未安装的字体,可将字体提前安装到目标系统,或确保Word文档已嵌入字体。
内容的提问来源于stack exchange,提问作者Leonardo Beltran
相关产品推荐
相关产品推荐

