如何编译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 myprograms
、myprogram.exe
或myprograms/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)以获取当前工作目录作为可执行文件所在的目录?的主要内容,如果未能解决你的问题,请参考以下文章