我已将我设计的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.
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
答案 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)