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

如何让编译后的python(使用cxFreeze)将当前工作目录作为可执行文件所在的目录?,python,pygame,cx-freeze,Python,Pygame,Cx Freeze,我正在mac上工作,我正在用python和pygame编写一个游戏,需要一些声音文件出现在源代码所在的同一目录中。问题是,当我通过python解释器运行源代码时,它是有效的。当我试图运行由cxFreeze编译的可执行文件时,它不起作用。我在互联网上搜索解决方案,但什么也没找到 在解释python时,cwd将是源代码所在的目录。当它使用cxFreeze编译并通过终端运行时,cwd将更改为我的主目录。这把事情搞砸了,因为我想让这个游戏便携,我需要的声音文件在同一个文件夹作为可执行文件 import

我正在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脚本的“包”选项中添加“操作系统”。它不起作用,我在这几个小时里一直没有找到解决办法。我如何才能让它工作?

尝试使用

os.path.abspath(__file__)

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

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

import os
import sys

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

从终端运行时,您是先导航到正确的文件夹,然后运行文件,还是输入更完整的路径(
cd myprograms
myprogram.exe
myprograms/myprogram.exe
)?如果您只想指向同一文件夹中的声音文件,则无需指定路径;只需使用
pygame.mixer.Sound('beep1.wav')
。我得到的“文件”没有定义