如何编译python(使用cxFreeze)以获取当前工作目录作为可执行文件所在的目录?

Posted

技术标签:

【中文标题】如何编译python(使用cxFreeze)以获取当前工作目录作为可执行文件所在的目录?【英文标题】:How do I get compiled python(with cxFreeze) to get the current working directory as the directory where the executable is in? 【发布时间】:2015-06-19 16:41:00 【问题描述】:

我正在使用 mac,我正在用 python 和 pygame 编写一个游戏,它需要一些声音文件存在于源代码所在的同一目录中。问题是当我通过 python 解释器运行源代码时它可以工作。当我尝试运行已由 cxFreeze 编译的可执行文件时,它不起作用。我在互联网上搜索了解决方案,但一无所获。

当解释 python 时,cwd 将是源代码所在的目录。当它使用 cxFreeze 编译并通过终端运行时,cwd 将更改为我的主目录。这搞砸了,因为我想让这个游戏可移植,并且我需要声音文件与可执行文件位于同一文件夹中。

import os

# Load the sound files.
CWDPATH = os.getcwd()
BEEP1 = pygame.mixer.Sound(os.path.join(CWDPATH, 'beep1.wav'))
BEEP2 = pygame.mixer.Sound(os.path.join(CWDPATH, 'beep2.wav'))
BEEP3 = pygame.mixer.Sound(os.path.join(CWDPATH, 'beep3.wav'))
BEEP4 = pygame.mixer.Sound(os.path.join(CWDPATH, 'beep4.wav'))

这部分代码是导致问题的原因。它在解释时运行顺利,但在使用 cxFreeze 编译时不起作用,因为 os.getcwd() 评估为主目录。我也尝试在 cxFreeze 脚本的 'packages' 选项中加入 'os'。它不起作用,我在没有解决方案的情况下工作了这几个小时。我怎样才能让它工作?

【问题讨论】:

从终端运行时,是先导航到正确的文件夹再运行文件,还是输入更完整的路径(cd myprogramsmyprogram.exemyprograms/myprogram.exe )?如果你只是想指向同一个文件夹中的声音文件,你不需要指定路径;只需使用pygame.mixer.Sound('beep1.wav') 【参考方案1】:

您可以使用sys.argv。命令行参数的第一个元素始终是程序本身:

import os
import sys

CWDPATH = os.path.abspath(os.path.dirname(sys.argv[0]))

【讨论】:

【参考方案2】:

尝试使用

os.path.abspath(__file__)

这将返回正在执行的脚本的绝对路径,因为您在同一路径中拥有音频文件,访问它们应该不是问题

【讨论】:

我没有定义“文件

以上是关于如何编译python(使用cxFreeze)以获取当前工作目录作为可执行文件所在的目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 cxfreeze 将我的代码从 python3.6 转换为 exe?

cxfreeze 中的 AVBin

使用cxfreeze对python文件进行打包

如何打包 PySide2 应用程序以进行分发?

cxfreeze 找不到 libpyside-python

cxfreeze打包python程序的方法说明(生成安装包,实现桌面快捷方式删除快捷方式)