鱼C论坛

 找回密码
 立即注册
查看: 1472|回复: 7

[已解决]Mac上pyinstaller打包问题

[复制链接]
发表于 2023-10-19 19:07:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本人用python的pandas读取excel,路径写成这个样子
path = './待清洗.xlsx'
df = pd.read_excel(path, sheet_name=0)

本意是想读取程序所在的文件夹内的excel表格
我通过pycharm可以运行,在win上通过pyinstaller打包好也可以运行,但在Mac上通过pyinstaller打包之后就提示以下内容:
Traceback (most recent call last):
  File "我的程序.py", line 15, in <module>
  File "pandas/io/excel/_base.py", line 504, in read_excel
  File "pandas/io/excel/_base.py", line 1563, in __init__
  File "pandas/io/excel/_base.py", line 1419, in inspect_excel_format
  File "pandas/io/common.py", line 872, in get_handle
FileNotFoundError: [Errno 2] No such file or directory: './待清洗.xlsx'
[4643] Failed to execute script '我的程序' due to unhandled exception!

新手求问是什么问题,我该如何解决,谢谢各位
最佳答案
2023-10-19 19:07:52
这个问题是由于在Mac上使用pyinstaller打包后,程序无法找到指定的Excel文件而导致的错误。这是因为pyinstaller在打包时无法正确处理相对路径的问题。

为了解决这个问题,你可以使用 sys 模块来获取程序所在的文件夹路径,并将路径与Excel文件名拼接起来,以确保程序可以正确找到Excel文件。

下面是修改后的代码示例:
import sys
import pandas as pd

# 获取程序所在文件夹的路径
path = sys.path[0] + '/待清洗.xlsx'
df = pd.read_excel(path, sheet_name=0)

通过使用 sys.path[0] ,我们可以获取到程序所在文件夹的路径,然后将其与Excel文件名拼接起来,确保程序可以正确找到Excel文件。

希望这个解决方案能够帮助到你!如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-19 19:07:52 | 显示全部楼层    本楼为最佳答案   
这个问题是由于在Mac上使用pyinstaller打包后,程序无法找到指定的Excel文件而导致的错误。这是因为pyinstaller在打包时无法正确处理相对路径的问题。

为了解决这个问题,你可以使用 sys 模块来获取程序所在的文件夹路径,并将路径与Excel文件名拼接起来,以确保程序可以正确找到Excel文件。

下面是修改后的代码示例:
import sys
import pandas as pd

# 获取程序所在文件夹的路径
path = sys.path[0] + '/待清洗.xlsx'
df = pd.read_excel(path, sheet_name=0)

通过使用 sys.path[0] ,我们可以获取到程序所在文件夹的路径,然后将其与Excel文件名拼接起来,确保程序可以正确找到Excel文件。

希望这个解决方案能够帮助到你!如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-19 19:08:47 | 显示全部楼层
问题分析:

根据你的描述,你在Mac上使用pyinstaller打包了一个程序,该程序使用pandas读取Excel文件。在打包后的程序中,你遇到了文件路径的问题。通过pycharm运行和在Windows上使用pyinstaller打包后的程序可以正常运行,但在Mac上运行打包后的程序时出现了文件找不到的错误。

回答:

这个问题可能是由于文件路径的不一致导致的。在不同的操作系统中,文件路径的表示方法可能有所不同。

对于解决此问题,有以下几种方法:

1. 使用绝对路径:可以尝试使用文件的绝对路径来确保程序能够找到文件。你可以通过打开终端,在终端中将文件拖到终端窗口中,即可获取文件的绝对路径。然后将程序中的路径写为绝对路径,例如path = '/Users/your_username/待清洗.xlsx',将 your_username 替换为你自己的用户名。

2. 使用相对路径:如果你希望程序能够读取程序所在文件夹内的Excel表格,可以使用相对路径。相对路径是相对于可执行程序所在的文件夹来指定文件路径。可以尝试修改路径为相对路径,例如path = './待清洗.xlsx'

3. 检查文件是否被正确打包:确保 Excel 文件在打包过程中被正确地包含在可执行文件中。你可以检查打包后的程序的目录结构,确认 Excel 文件是否被正确地复制到可执行文件所在的目录。

请尝试上述方法之一,看是否能够解决问题。希望能帮到你!如有其他问题,请随时追问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-19 19:26:59 | 显示全部楼层
isdkz 发表于 2023-10-19 19:07
这个问题是由于在Mac上使用pyinstaller打包后,程序无法找到指定的Excel文件而导致的错误。这是因为pyinsta ...

您好,我理解了sys.path[0],从原理上来说我也觉得这个方法可行,但我尝试之后,还是报错,可否再帮帮忙
Traceback (most recent call last):
  File "我的程序.py", line 16, in <module>
  File "pandas/io/excel/_base.py", line 504, in read_excel
  File "pandas/io/excel/_base.py", line 1563, in __init__
  File "pandas/io/excel/_base.py", line 1419, in inspect_excel_format
  File "pandas/io/common.py", line 872, in get_handle
NotADirectoryError: [Errno 20] Not a directory: '/var/folders/7q/_mf3hd1d02ndckrwpmmc5zbr0000gn/T/_MEI4WhtHn/base_library.zip/待清洗.xlsx'
[5233] Failed to execute script '我的程序' due to unhandled exception!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-19 19:28:18 | 显示全部楼层
Mike_python小 发表于 2023-10-19 19:08
问题分析:

根据你的描述,你在Mac上使用pyinstaller打包了一个程序,该程序使用pandas读取Excel文件。在 ...

您好,我的代码里确实是使用您说的2中的方法,写的相对路径,但就是打包之后,看起来这个相对路径不能被识别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-19 19:47:15 | 显示全部楼层
isdkz 发表于 2023-10-19 19:07
这个问题是由于在Mac上使用pyinstaller打包后,程序无法找到指定的Excel文件而导致的错误。这是因为pyinsta ...

我在pycharm中,sys.path[0]还可以返回正常的路径,但是打包后,这个语句返回的路径看起来就像乱码一样,这应该是引起报错的原因,但是我不明白为什么,请问这个该怎么修改呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-19 20:17:32 | 显示全部楼层
chengzhi61 发表于 2023-10-19 19:47
我在pycharm中,sys.path[0]还可以返回正常的路径,但是打包后,这个语句返回的路径看起来就像乱码一样, ...

换成下面的代码看看:
import os
path = os.path.join(os.path.dirname(__file__), '待清洗.xlsx')
df = pd.read_excel(path, sheet_name=0)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-19 20:47:17 | 显示全部楼层
isdkz 发表于 2023-10-19 20:17
换成下面的代码看看:

啊谢谢,我自己找到答案了,这个方法需要先识别运行的是脚本,还是打包好的app,然后用sys.excutable就可以返回出来正确的路径
import os
import sys


# determine if application is a script file or frozen exe
if getattr(sys, 'frozen', False):
    path = os.path.dirname(sys.executable)
elif __file__:
    path = os.path.dirname(__file__)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 10:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表