在python exe中放置图像文件夹的位置?

时间:2012-06-04 19:00:56

标签: python pygame py2exe

我已将我设计的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

来自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

2 个答案:

答案 0 :(得分: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脚本中的当前目录,因此您可以继续将其称为相对子目录。

答案 1 :(得分:0)

看起来您已经通过将文件夹移动到dist来解决图像问题。另一方面,缺少的字体模块是pygame和py2exe之间的known problem。 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上试试example py2exe setup file。如果它们都不起作用,请在您的问题中添加错误消息。


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

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