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
相关产品推荐
相关产品推荐

