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

Python脚本转可执行文件后无法保存文件问题求助

Python脚本转可执行文件后无法保存/创建文件的解决方法

你的问题核心在于打包成可执行文件后,路径处理逻辑失效,同时可能伴随权限或资源打包不全的问题。以下是针对性的解决方案:

1. 修正路径获取逻辑(最关键)

原脚本中使用__file__获取路径,但打包工具(如PyInstaller)会将代码解压到临时目录运行,__file__指向的是临时文件而非exe所在目录,导致切换目录或保存路径错误。

修改路径处理代码,适配打包环境:

import os
import sys

# 获取正确的运行路径
if getattr(sys, 'frozen', False):
    # 打包为exe后的环境,获取exe所在目录
    fp = os.path.dirname(sys.executable)
else:
    # 正常Python脚本运行环境
    fp = os.path.dirname(__file__)
os.chdir(fp)

同时,保存条码文件时建议使用绝对路径,避免当前目录异常:

# 替换原保存代码
my_barcode.save(os.path.join(fp, cs))

2. 解决文件写入权限问题

如果exe放在系统受保护目录(如C:\Program Files),普通用户权限无法写入文件。解决方式:

  • 将exe移动到用户目录(如Documents、桌面)运行
  • 右键exe选择「以管理员身份运行」

3. 确保barcode库资源被完整打包

barcode库依赖内部的模板文件,打包时如果未包含这些文件,会导致生成图片失败。以PyInstaller为例,打包时需添加--add-data参数:

# 替换为你的脚本文件名,Windows系统用分号分隔路径
pyinstaller --onefile --add-data "venv/Lib/site-packages/barcode/templates;templates" your_script.py

如果使用虚拟环境,路径需对应你的虚拟环境中barcode的templates目录位置;Linux/macOS用冒号分隔路径。


修改后的完整脚本

import os
import sys
from tkinter import Button, Entry, Label, Tk

import barcode
from barcode.writer import ImageWriter

root = Tk()
root.minsize(400, 200)

# 适配打包后的标题获取
if getattr(sys, 'frozen', False):
    title = os.path.basename(sys.executable)[0:-4]
else:
    title = os.path.basename(__file__)[0:-3]
root.title(title.title())

# 获取正确的运行路径
if getattr(sys, 'frozen', False):
    fp = os.path.dirname(sys.executable)
else:
    fp = os.path.dirname(__file__)
os.chdir(fp)


def calculated(event=None):
    number = e1.get()
    cs = barcode.UPCA(number).get_fullcode()
    barcode_format = barcode.get_barcode_class("upc")
    my_barcode = barcode_format(number, writer=ImageWriter())
    # 使用绝对路径保存
    my_barcode.save(os.path.join(fp, cs))


lbl1 = Label(root, text="Enter UPC-A code : ")
lbl1.grid(column=0, row=0)
e1 = Entry(root)
e1.grid(column=1, row=0, ipadx=5, padx=5, pady=5)
btn1 = Button(root, text="Calculate", command=calculated)
btn1.grid(column=2, row=0)
root.bind('<Return>', calculated)
root.mainloop()

内容的提问来源于stack exchange,提问作者Michael Mulvey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:30:58