You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用PyInstaller打包Python项目为可执行文件后无法运行求助

解决PyInstaller打包后找不到CSV文件的问题

看起来你已经走对了方向,核心问题就是打包后程序的工作路径和开发时完全不一样,下面一步步帮你搞定:

1. 先修复spec文件里的错误

你的spec文件里hiddenimports这一行有两个明显问题:

  • 语法错误:items_pro_processing.csv前面少了一个单引号
  • 逻辑错误:hiddenimports是用来指定PyInstaller没自动检测到的Python模块的,CSV是数据文件,根本不需要放在这里

把这一行改成:

hiddenimports=[],

另外,datas部分可以简化成批量匹配,不用一个个写CSV文件名:

datas=[('*.csv', '.')],

这样所有同目录下的CSV文件都会被自动打包进去,更省心。

2. 关键操作:所有读取CSV的代码都要用上resource_path

你已经添加了resource_path函数,但必须确保所有读取CSV的地方都用这个函数来获取文件路径,而不是直接写文件名!

比如原来你可能写的是:

import pandas as pd
df = pd.read_csv('items_pro_processing.csv')

现在必须改成:

import pandas as pd
import os
import sys

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)

# 用resource_path获取正确的文件路径
df = pd.read_csv(resource_path('items_pro_processing.csv'))

重点提醒:如果你的其他7个Python脚本也有读取CSV的代码,每个脚本都要做同样的修改;或者把resource_path函数写成一个单独的工具模块(比如utils.py),然后在所有需要的脚本里导入它。

3. 重新打包并测试

修改完所有代码和spec文件后,用以下命令重新打包:

pyinstaller GUI.spec

然后运行dist/GUI.app,这时候程序应该能正确找到CSV文件了。

解释你之前的输出

你运行开发环境的GUI.py时,resource_path("")返回的是当前项目目录(/Users/pierre/Desktop/exx/),所以输出里能看到所有文件,这说明开发环境下路径是正常的。但打包后运行GUI.app时,sys._MEIPASS会指向打包程序内部的资源目录,这时候只有用resource_path才能找到打包进去的CSV文件。

额外注意点

  • 如果你是用--onefile参数打包成单个文件,PyInstaller会在运行时把文件解压到临时目录,resource_path会自动指向这个临时目录;如果是默认的onedir模式,文件会放在app包的对应目录里,函数同样适用。
  • 打包后可以右键点击GUI.app -> 显示包内容,检查Contents/Resources目录下是否有你的CSV文件,确认它们被正确打包进去了。

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

火山引擎 最新活动