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

时间:2019-06-24 08:57:11

标签: python executable cx-freeze

我正在用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 个答案:

答案 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