auto-py-to-exe打包单exe后csv读写失败及控制台关闭问题咨询
问题1:单EXE打包后CSV无法读写的解决方案
问题原因
PyInstaller单文件模式运行逻辑是:启动时将所有打包的资源解压到系统临时目录下的随机文件夹,程序退出后该临时文件夹会被自动删除。你当前将user_data.csv打包后,读写路径指向的是这个临时目录,写入的数据会随着程序退出被清除,下次启动自然读不到更新的内容。
修复步骤
- 新增获取EXE实际运行目录的函数,将用户数据存储在EXE所在目录而非临时目录:
import sys import os import shutil def get_exe_dir(): # 打包后返回EXE所在目录,开发调试时返回脚本所在目录 if getattr(sys, 'frozen', False): return os.path.dirname(sys.executable) return os.path.dirname(os.path.abspath(__file__)) def resource_path(relative_path): # 原有的资源路径函数,用于读取chromedriver等打包的静态资源 base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) return os.path.join(base_path, relative_path)
- 调整CSV路径逻辑,首次运行时如果EXE目录不存在CSV,可将打包的默认CSV模板复制到EXE目录:
# 调整后的CSV路径定义 data_file = os.path.join(get_exe_dir(), 'user_data.csv') # 首次运行如果没有CSV,复制打包的模板到工作目录 if not os.path.exists(data_file): # 如果打包时带了默认CSV模板,就复制,没有的话可以删掉这部分,写入时会自动创建 default_csv = resource_path('./user_data.csv') if os.path.exists(default_csv): shutil.copy(default_csv, data_file)
- 优化写入逻辑,避免文件句柄未释放导致写入失败:
import csv def writedata(): with open(data_file, 'w', encoding='utf8', newline='') as user_data: writer = csv.writer(user_data, lineterminator = '\n') titles = ['Sl', 'Name', 'E-mail', 'Password'] writer.writerow(titles) for i in range(len(usernames)): writer.writerow([i+1,company_Names[i],usernames[i],passwords[i]])
- 打包配置调整:
--add-data "user_data.csv;."参数可以保留,用来打包默认的CSV模板,也可以删掉直接让程序自动创建新的CSV文件。
问题2:控制台关闭方式设置
按任意键关闭
在程序所有逻辑执行完毕的末尾添加以下代码即可:
# 方式1:需要按回车后退出,兼容所有系统 input("按任意键退出...") # 方式2:无需回车,按任意键直接退出,仅Windows可用 import msvcrt print("按任意键退出...") msvcrt.getch()
自动关闭控制台
默认情况下双击运行打包后的console程序,执行完全部代码后会自动关闭。如果出现无法自动关闭的情况,一般是代码有未捕获的异常导致程序卡住,添加全局异常捕获即可:
import sys if __name__ == "__main__": try: # 你的主程序逻辑写在这里 your_main_function() except Exception as e: print(f"程序运行出错:{str(e)}") # 出错后可以停留查看报错,也可以直接写sys.exit()实现出错也自动关闭 input("按任意键退出...") sys.exit()
内容的提问来源于stack exchange,提问作者Pranto
相关产品推荐
相关产品推荐

