使用 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 4.3.1 冻结 h5py 2.4 时出错
使用 cx_freeze 冻结后的绝对路径(Qt5 / PySide2 App)
如何使用 cx_Freeze 冻结双模式(GUI 和控制台)应用程序?
如何在使用 cx_Freeze 6.0b1 冻结的 Linux 上修复 python 3.7.3 脚本上的 numpy 依赖项路径?