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,但给出相同的Cannot load image错误。尝试将images文件夹放在与 exe 相同的文件夹中会创建一个Runtime Error: The application requested the runtime to terminate it in an unusual way.

Slace Diamond 建议的代码的缩短形式可防止 py2exe 找到Table_Wars.py

从命令:

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

setup并且Table_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

4

2 回答 2

1

当您使用 py2exe(和 py2app )构建可分发包时,包环境的一部分是指向文件的本地资源位置。在您的普通未打包版本中,您指的是相对的“图像/”位置。对于打包版本,您需要配置您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 脚本中的当前目录,因此您可以继续将其称为相对子目录。

于 2012-06-04T19:44:47.827 回答
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 wiki 上的示例 py2exe 设置文件。如果它们都不起作用,请将错误消息添加到您的问题中。


我尝试在示例项目上运行 py2exe,当我使用默认的 pygame 字体时,它也会中断。如果您使用的是默认字体,请尝试将 ttf 文件放在项目的根目录以及 dist 文件夹中。您还必须更改pygame.Font脚本中的调用:

font = pygame.font.Font("SomeFont.ttf", 28)
于 2012-06-06T05:34:40.937 回答