我正在用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__
仅返回我的主目录,因此会引起回溯。
答案 0 :(得分:0)
cx_Freeze文档中有一个专门针对此问题的Using data files节,内容为:
除代码外,应用程序通常还需要数据文件,例如图标。使用setup script,可以在
include_files
的{{1}}选项中列出数据文件或目录。它们将被复制到可执行文件旁边的构建目录中。然后找到它们,使用如下代码:build_exe
另一种方法是将数据嵌入代码中,例如通过使用Qt的资源系统。
还有一点需要注意,如果您使用的是cx_Freeze版本5.1.0或5.1.1:程序包将包含在冻结应用程序的build目录的子目录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)
中,而它们位于未冻结的应用程序的主目录或Python安装的lib
目录中。如果您从主应用程序引用了位于软件包目录中的数据文件,则需要使用以下命令将该附加site-packages
添加到相对路径中: lib
(或从另一个方向将其删除)。
但是,对于您而言,我猜os.path.join()
只是一个数据目录,而不是带有Python代码的软件包。然后,您只需要将Resources
添加到安装脚本中的'Resources'
列表中。要获得位于include_files
目录中的名为filename
的文件,可以像下面这样修改示例代码:
Resources