在Python可执行文件中放置图像文件夹的位置在哪里?

3

我把我设计的Python游戏转化成了exe格式。运行exe文件会出现闪烁并立即关闭,说明出现了错误。在命令提示符中运行也会出现错误,并记录下来:

Cannot load image: Playfield.png
Couldn't open images\Playfield.png

这段文字告诉我load_image块存在问题。我以前遇到过这种情况,当时是因为我没有一个images目录。
我尝试将images文件夹移动到dist目录中,但是出现了以下错误:
Traceback (most recent call last):
    File "Table_Wars.py", line 728, in <module>
    File "Table_Wars.py", line 51, in main
    File "Table_Wars.py", line 236, in __init__
    File "pygame\__init__.pyc", line 70, in __getattr__
NotImplementedError: font module not available
(ImportError: DLL load failed: The specified module could not be found.)

这是我第一次使用py2exe,所以我不太确定发生了什么。原始的Python文件本身(Table_Wars.py)可以正常运行。

如果有帮助的话,整个Table_Wars文件夹的位置在我的桌面上的一个名为Games的文件夹内(C:\Users\Oventoaster\Desktop\Games\Table_Wars)。我正在运行Windows 7 32位操作系统。

根据要求,以下是我生成的output.txt:

Folder PATH listing for volume OS
Volume serial number is 7659-4C9C
C:\USERS\OVENTOASTER\DESKTOP\GAMES\TABLE_WARS
build
   bdist.win32
       winexe
           bundle-2.7
           collect-2.7
              ctypes
              distutils
              email
                 mime
              encodings
              logging
              multiprocessing
                 dummy
              pygame
                 threads
              unittest
              xml
                  parsers
           temp
dist
images

以下是我用于转换文件的setup.py:

from distutils.core import setup
import py2exe

setup(console=['Table_Wars.py'])

编辑:我尝试使用完整的 py2exe 示例。这个命令将创建 exe,但是出现了相同的“无法加载图像”错误。 将 images 文件夹放在与 exe 相同的文件夹中会创建一个“运行时错误:应用程序请求以不寻常的方式终止它。”

Slace Diamond 建议的代码缩写防止了 py2exe 找到 Table_Wars.py:

来自 cmd 的代码:

running py2exe
*** searching for required modules ***
error: Table_Wars.py: No such file or directory.

setupTable_Wars在同一目录下。如果需要,我会输入到python.exe和setup.py的完整路径。

编辑:我似乎越来越接近了。我将images目录放在self.extra_datas中,现在我得到了这个错误:

Fatal Python error: (segmentation fault) This application has requested the runtime to terminate it in an unusual way. Please contact the application's suppourt team for more information


你能否运行 tree "C:\Users\Oventoaster\Desktop\Games\Table_Wars" > output.txt 并上传出现的 output.txt 文件?这将更好地帮助我们了解文件的位置。 - Nick ODell
我认为这实际上只是你的py2exe设置文件的问题。你能否请发布你的 setup.py 文件? - jdi
问题与工作目录有关,可执行文件的启动相对路径应该与工作目录对齐,以便正确解析。或者如果可能的话,尝试在程序中连接图像的完整路径,然后您就可以看到路径是如何不正确地形成的了。 - zinking
2个回答

1

当您使用py2exe(以及py2app)构建可分发的软件包时,软件包环境的一部分是指向本地资源文件的位置。在未打包的版本中,您引用了相对路径“images/”。对于已打包的版本,您需要配置setup.py以将资源包含在其自己的位置中。

请参考此文档,了解有关如何设置软件包的data_files选项的非常具体的信息:http://www.py2exe.org/index.cgi/data_files

该页面有多个示例,展示了非常简单的路径和一个帮助函数,用于查找数据并为您构建data_files列表。

这是一个简单代码片段的示例:

from distutils.core import setup
import py2exe

Mydata_files = [('images', ['c:/path/to/image/image.png'])]

setup(
    console=['trypyglet.py.py']
    data_files = Mydata_files
    options={
                "py2exe":{
                        "unbuffered": True,
                        "optimize": 2,
                        "excludes": ["email"]
                }
        }
)

这与您尝试实现的内容非常相似。它表示"image.png"源文件应该放置在资源位置根目录下的"images"目录中。这个资源根目录将是您Python脚本的当前目录,因此您可以继续将其作为相对子目录引用。


具体是什么语法错误?可能只是缩进问题。 - jdi

0

看起来您已经通过将文件夹移动到dist中解决了图像问题。另一方面,缺失的字体模块是pygame和py2exe之间的已知问题。Py2exe没有复制一些必要的DLL文件,因此您需要覆盖py2exe的isSystemDLL方法,强制它包括音频和字体相关的DLL文件。

如果Table_Wars.py是您项目中唯一的模块,请尝试使用python setup.py py2exe运行此脚本:

from os.path import basename
from distutils.core import setup

import py2exe

origIsSystemDLL = py2exe.build_exe.isSystemDLL
def isSystemDLL(pathname):
    if basename(pathname).lower() in ("libogg-0.dll", "sdl_ttf.dll"):
        return 0
    return origIsSystemDLL(pathname)
py2exe.build_exe.isSystemDLL = isSystemDLL

setup(windows=[{"script": "Table_Wars.py"}],
      options={"py2exe": {"dist_dir": "dist"}})

你也可以尝试在pygame维基上使用example py2exe setup file。如果两者都不起作用,请将错误消息添加到您的问题中。

我尝试在一个示例项目上运行py2exe,当我使用默认的pygame字体时,它也会出现错误。如果你正在使用默认字体,请尝试将ttf文件放在你的项目根目录和dist文件夹中。你还需要在脚本中更改对pygame.Font的调用:

font = pygame.font.Font("SomeFont.ttf", 28)

我正在尝试完整的py2exe安装文件,但是我遇到了这个异常:Traceback (most recent call last): File "C:\Users\Oventoaster\Desktop\Games\Table_Wars\setup.py", line 170, in BuildExe().run() #Run generation File "C:\Users\Oventoaster\Desktop\Games\Table_Wars\setup.py", line 161, in run dist_dir = self.dist_dir File "C:\Python27\lib\distutils\core.py", line 169, in setup raise SystemExit, "error: " + str(msg) SystemExit: error: command 'C:\Python27\pythonw.exe' failed with exit status 1 - Oventoaster
你尝试过在调用“setup”之前仅添加发布的代码吗?我认为您不需要整个设置文件,我只是链接到它以显示该过程受pygame支持,尽管它是py2exe代码的黑客。如果您想使用完整的设置文件,请尝试删除“'optimize':2”,如另一个问题中所建议的 - 0eggxactly
我尝试了你的建议,发生了以下情况: 当我只添加答案中的代码块时,它无缘无故地关闭了。另一个建议创建了一个exe文件,但是当我将图像放入dist文件夹中时,出现了运行时错误。 - Oventoaster
我在我的帖子中添加了一个脚本,请告诉我运行时会发生什么。至于维基百科的示例,你能发布错误吗? - 0eggxactly
我在帖子中更新了一些有关指定ttf的信息。如果您正在使用默认字体(即将None传递给pygame.font.Font),这可能会有所帮助。 - 0eggxactly
经过一些研究,我认为我正在使用的机器是问题所在。维基百科指出该程序是64位的,而我的操作系统是32位的。 - Oventoaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接