"pyinstaller game.py" 工作正常但 --onefile 没有。 (我不能有任何依赖,因为它在没有 --onefile 的情况下工作)

"pyinstaller game.py" works fine but --onefile does not. (I can't have any dependencies cos it works without --onefile)

当我 运行: pyinstaller game.py 它工作正常。我将我的资源文件夹复制并粘贴到 dist 和游戏 运行s 中。

然而,dist 文件夹中的其他文件太多,人们很难找到要单击的文件,所以我想使用 --onefile

我尝试这样做并将资源文件夹粘贴到 dist 并尝试 运行 玩游戏,控制台 window 出现了一秒钟然后几乎立即消失了。 (我假设我缺少一个依赖项,但这怎么可能?没有 --onefile 也能正常工作)

--onefile 是否不适用于我导入图像和字体之类的布局?

图片:

if getattr(sys, 'frozen', False):
    CURRENT_DIRECTORY = sys._MEIPASS
else:
    CURRENT_DIRECTORY = os.path.dirname(os.path.abspath(__file__))

bg = (pygame.image.load(os.path.join(CURRENT_DIRECTORY, r"Resources\backgroundlvl0.png")),
    pygame.image.load(os.path.join(CURRENT_DIRECTORY, r"Resources\backgroundlvl1.png")),
    pygame.image.load(os.path.join(CURRENT_DIRECTORY, r"Resources\backgroundlvl2.png")),
    pygame.image.load(os.path.join(CURRENT_DIRECTORY, r"Resources\backgroundlvl3.png")))

字体:

font = pygame.font.Font(os.path.join(CURRENT_DIRECTORY, r"Resources\arial.ttf"), 36)

好吧,这花了很长时间,但我相信我现在已经为任何感兴趣的人找到了我的问题的答案。

当 运行 我的游戏在我的 IDE 中时,它可以正常工作,我会像这样导入相关图片:

bg = (pygame.image.load(os.path.join(CURRENT_DIRECTORY, r"Resources\backgroundlvl0.png")),
    pygame.image.load(os.path.join(CURRENT_DIRECTORY, r"Resources\backgroundlvl1.png")),
    pygame.image.load(os.path.join(CURRENT_DIRECTORY, r"Resources\backgroundlvl2.png")),
    pygame.image.load(os.path.join(CURRENT_DIRECTORY, r"Resources\backgroundlvl3.png")))

出于某种原因,如果我将我的资源文件夹和 game.py 移动到另一个目录,当我 运行 游戏时,我会得到一个 nameError: name 'os' is未定义 python。这对我来说是个谜,但是,我还注意到 pyinstaller 不喜欢这种导入图像的格式,因此不适用于 --onefile。

因此,我尝试了这个替代方案:

    bg = (pygame.image.load(os.path.join('Resources', 'backgroundlvl0.png')),pygame.image.load(os.path.join('Resources', 'backgroundlvl1.png')),pygame.image.load(os.path.join('Resources', 'backgroundlvl2.png')),pygame.image.load(os.path.join('Resources', 'backgroundlvl3.png')) )

由于某些 st运行ge 原因,这在我的 IDE 中有效,但是,当我右键单击 .py 文件并按打开方式 -> python 3.8 时,它崩溃。无论如何,它似乎适用于 pyinstaller。

带走什么:

如果您使用的是 pyinstaller 并且想要一个文件,请使用 pyinstaller --onefile name.py。确保在 name.py 中使用 os.path.join('foldername', 'file') 引用了您使用的具有依赖项的文件夹。我必须专门这样做:pygame.image.load(os.path.join(....