将转换后的 .py 文件的工作目录设置为 .exe 文件

Setting working directory of a converted .py file to .exe file

我在转换后的 .exe 文件时遇到问题。它没有找到我的 excel 文件。

我有以下代码

import pandas as pd
import os

abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
os.chdir(dname)

#Load data
data = pd.read_excel("data.xlsx")
...

代码的第二部分 (abspath, dname, os.chdir(dname) 将路径设置为 .py 文件的位置。因此,将 .py 文件和 .xlsx 文件放在一起将无论位置如何,始终让它找到它。

然后我使用

将它转换为.exe
pyinstaller --hidden-import=pandas --onefile script.py

为了使我的 script.py 正常工作,我必须将 data.xlsx 文件与 script.py 文件放在同一文件夹中。

我假设将 .exe 文件从 dir 文件夹拖到与 .xlsx 文件相同的位置将使它 运行 但是 运行 将 .exe 文件 returns 出现以下错误:

无法执行脚本脚本。目录中没有这样的文件 'data.xlsx'。

无论“.exe+.xlsx”文件夹的位置如何,如何让它读取我的 excel 文件?

您遇到的问题是,当您 运行 可执行文件被提取到一个临时目录并从那里 运行 时。这意味着 i) current/working 目录是临时目录,并且 ii) 实际执行的程序的位置也是该临时目录,因此两种获取路径的方式都不会满足您的要求。

但是,当 运行 作为可执行文件时,一些附加值可通过 sys 模块使用。在这种情况下有用的是 sys.frozen,它设置为 True,和 sys.executable,它设置为用户 运行 的可执行文件的位置。

过去我通过以下方式找到了我需要的路径:

if getattr(sys, 'frozen', False):
    app_path = os.path.dirname(sys.executable)
else:
    app_path = os.path.dirname(os.path.abspath(__file__))

其中 app_path 现在将成为脚本或可执行文件的目录。然后您可以以此为基础访问其他文件。