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

PyInstaller单文件打包Python条码生成脚本的路径问题咨询

解决PyInstaller单文件打包后的路径问题

问题根源

单文件打包时,sys._MEIPASS指向程序运行时临时解压的目录,里面的文件是打包时的静态副本——用户修改外部的Inventory.xlsm不会同步到这里,而且保存到临时目录的条码文件会在程序退出后被自动删除。

解决方案

1. 修正基础路径获取逻辑

放弃用sys._MEIPASS作为可读写文件的基础路径,改为获取可执行文件所在的实际目录,保证读取的是用户可修改的外部Excel,且生成的条码文件能永久保存。

2. 修改后的main函数代码

def main():
    # 获取可执行文件所在的目录(打包/未打包状态均生效)
    if getattr(sys, 'frozen', False):
        base_path = os.path.dirname(sys.executable)
    else:
        base_path = os.path.dirname(os.path.abspath(__file__))
    
    # 构建Inventory.xlsm的绝对路径
    inventory_path = os.path.join(base_path, 'sheets', 'Inventory.xlsm')
    # 恢复文件存在性校验(避免找不到文件时崩溃)
    if not os.path.isfile(inventory_path):
        print(f"Error: 文件 {inventory_path} 不存在。")
        sys.exit(1)

    # 使用绝对路径加载数据,禁止用相对路径
    df = loadData(inventory_path)
    
    SKU = df.apply(generateSKU, axis=1)
    df = df.assign(SKU=SKU)

    # 保存Barcodes.xlsx到可执行文件同目录的sheets文件夹
    barcodes_path = os.path.join(base_path, 'sheets', 'Barcodes.xlsx')
    saveData(df, barcodes_path)

    # 生成条码保存目录(可执行文件同目录下的barcodes文件夹)
    barcode_dir = os.path.join(base_path, 'barcodes')
    if not os.path.exists(barcode_dir):
        os.makedirs(barcode_dir)
    
    for code in SKU:
        generateBarcode(code, barcode_dir)

3. 打包命令

无需使用--add-data参数打包Inventory.xlsm,直接执行:

pyinstaller --onefile your_script_name.py

4. 使用说明

  • 将生成的exe文件和sheets文件夹放在同一目录,Inventory.xlsm放在sheets文件夹内;
  • 程序运行时会自动在exe同目录生成barcodes文件夹,用于保存条码PNG;
  • 用户修改Inventory.xlsm后,重新运行exe即可读取最新数据并生成对应条码。

内容的提问来源于stack exchange,提问作者Noah Bhuiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:22:04