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

使用Flet Pack打包macOS应用时.app文件无法找到credentials.log问题

Flet打包macOS .app文件时找不到credentials.log的问题

问题详情

项目文件结构如下:

PyFlutter
|_ assets
|  |_ fonts
|  |  |_font
|  |_ image.png
|_ backend.py
|_ credentials.log
|_ main.py
|_ icon.png

使用Flet CLI打包命令:

flet pack "main.py" -n "AltExp-beta" --add-data "assets:assets" --add-data ".:backend.py" --icon "icon.png" --add-data ".:credentials.log"

生成的.spec文件中datas段为:

datas=[('assets', 'assets'), ('.', 'backend.py'), ('.', 'credentials.log')],

打包完成后,直接运行包内的Unix可执行文件一切正常,但运行AltExp-beta.app时弹出错误:

Unable to proceed your request [Error]: "credentials.log" not found

原因分析

macOS的.app bundle运行时,程序的当前工作目录是用户的Home目录,而非.app包内部的资源目录;但直接运行可执行文件时,工作目录是可执行文件所在路径,因此能正常找到文件。同时,原打包命令中--add-data ".:credentials.log"的写法逻辑混乱,容易导致文件路径映射错误。

解决步骤

1. 修正打包命令的--add-data参数

将文件的映射关系调整为源文件:目标路径,确保文件被打包到可执行文件同级目录:

flet pack "main.py" -n "AltExp-beta" --add-data "assets:assets" --add-data "backend.py:." --icon "icon.png" --add-data "credentials.log:."

2. 在代码中动态获取资源路径

不要直接使用相对路径读取文件,通过sys._MEIPASS(PyInstaller打包后的资源根目录)构建绝对路径,兼容开发环境与打包环境:

import os
import sys

def get_resource_path(relative_path):
    # 打包后环境使用MEIPASS路径,开发环境使用当前目录
    base_path = getattr(sys, '_MEIPASS', os.path.abspath('.'))
    return os.path.join(base_path, relative_path)

# 读取credentials.log时使用该函数获取路径
log_file = get_resource_path("credentials.log")
with open(log_file, "r") as f:
    # 处理文件内容
    pass

3. 验证.spec文件配置

修正后.spec文件的datas应更新为:

datas=[('assets', 'assets'), ('backend.py', '.'), ('credentials.log', '.')],

完成以上修改后,运行AltExp-beta.app即可正常找到credentials.log文件。

内容的提问来源于stack exchange,提问作者Edoardo Balducci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:03:14