使用 cx_Freeze 冻结成可执行文件后如何知道当前文件路径?

Posted

技术标签:

【中文标题】使用 cx_Freeze 冻结成可执行文件后如何知道当前文件路径?【英文标题】:How to know the current file path after being frozen into an executable using cx_Freeze? 【发布时间】:2019-06-24 08:57:11 【问题描述】:

我正在用 Python 制作游戏。由于我使用的是 Python3,我必须将我的脚本 cx_Freeze 冻结为可执行文件,以让其他没有 Python3 的人运行游戏。我已将资源(纹理、音频、文件等)放在与脚本路径相关的文件夹中。当我没有 cx_Freeze 脚本时,我使用__file__ 来定位脚本并使用它来定位资源并使用它们。但是一旦使用 cx_Freeze 冻结,这个方法就不起作用了。

我的问题是,如何在使用 cx_Freeze 冻结脚本后找到它的文件路径?

我已经尝试过__file__、os 模块和任何其他与文件路径相关的模块。

path = str(__file__).split("/")
path.remove("My executable name")
path.remove("MacOS")
path = "/".join(path) + "/Resources/"

我希望返回我的 Resources 文件夹,但 __file__ 只返回我的主目录,因此这会导致回溯。

【问题讨论】:

【参考方案1】:

在 cx_Freeze 文档中有一个部分 Using data files 专门针对这个问题,说:

应用程序通常需要除代码之外的数据文件,例如图标。使用setup script,您可以在include_files 选项中列出数据文件或目录build_exe。它们将被复制到可执行文件旁边的构建目录中。然后找到它们,使用如下代码:

def find_data_file(filename):
    if getattr(sys, 'frozen', False):
        # The application is frozen
        datadir = os.path.dirname(sys.executable)
    else:
        # The application is not frozen
        # Change this bit to match where you store your data files:
        datadir = os.path.dirname(__file__)
    return os.path.join(datadir, filename)

另一种方法是将数据嵌入代码中,例如使用 Qt 的资源系统。

如果您使用的是 cx_Freeze 版本 5.1.0 或 5.1.1,还有一点需要注意:软件包将包含在冻结应用程序构建目录的子目录 lib 中,而它们位于主目录中解冻的应用程序或 Python 安装的site-packages 目录中。如果您从主应用程序引用位于包目录中的数据文件,则需要将此附加 lib 添加到相对路径中,例如使用os.path.join()(或从另一个方向移除)。

但是,在您的情况下,我猜Resources 只是一个数据目录,而不是包含 Python 代码的包。然后您只需将'Resources' 添加到安装脚本中的include_files 列表中。要获取位于Resources 目录中的名为filename 的文件,像这样修改的示例代码应该可以完成这项工作:

def find_data_file(filename):
    if getattr(sys, 'frozen', False):
        # The application is frozen
        datadir = os.path.dirname(sys.executable)
    else:
        # The application is not frozen
        datadir = os.path.dirname(__file__)
    # The following line has been changed to match where you store your data files:
    return os.path.join(datadir, 'Resources', filename)

【讨论】:

以上是关于使用 cx_Freeze 冻结成可执行文件后如何知道当前文件路径?的主要内容,如果未能解决你的问题,请参考以下文章

使用 cx_Freeze 冻结 Python 3.7 脚本时如何修复错误

使用 cx_Freeze 冻结时不显示主窗口图标

使用 cx_freeze 4.3.1 冻结 h5py 2.4 时出错

使用 cx_freeze 冻结后的绝对路径(Qt5 / PySide2 App)

如何使用 cx_Freeze 冻结双模式(GUI 和控制台)应用程序?

如何在使用 cx_Freeze 6.0b1 冻结的 Linux 上修复 python 3.7.3 脚本上的 numpy 依赖项路径?