我已经指出了将我的pygame导出到分布目的可执行文件中的问题。我仍然有一个问题:当我运行setup.py(我使用Python版本3.7.0)并构建应用程序时,该应用程序直接崩溃,并且我也无法打开UNIX可执行文件。这正是我到目前为止所做的:
我的setup.py:
from cx_Freeze import setup, Executable
# Dependencies are automatically detected, but it might need
# fine tuning.
build_exe_options = {"include_files" : ["pic.png", "sound.wav"]} # there are more files, i.e. all pics and audio files used
import sys
base = 'Win32GUI' if sys.platform=='win32' else None
executables = [
Executable('pythonGame.py', base=base)
]
setup(name='MyGame',
version = '1.0',
description = 'blabla',
options = dict(build_exe = build_exe_options),
executables = executables)
当我运行setup.py以通过:
创建独立应用程序时python setup.py bdist_mac
我收到(许多)错误消息(参见终端输出的最后3行):
> error: /Library/Developer/CommandLineTools/usr/bin/install_name_tool:
> input file:
> build/GesaGame-1.0.app/Contents/MacOS/lib/pygame/pygame_icon.icns is
> not a Mach-O file @loader_path/.dylibs/libSDL-1.2.0.dylib error: can't
> copy '@loader_path/.dylibs/libSDL-1.2.0.dylib': doesn't exist or not a
> regular file
或更深层
> error: /Library/Developer/CommandLineTools/usr/bin/install_name_tool:
> input file: build/GesaGame-1.0.app/Contents/MacOS/RunningCleats.wav is
> not a Mach-O file
但是,已经创建了构建文件夹。打开它时,我找到了指定的程序,但是它在启动它后直接崩溃。我在这里做错了什么?我怀疑这与随附的文件有关,但我无法理解它。
,因为我不知道MacOS环境并且没有任何测试系统,我只能猜测您的设置脚本潜在的问题。
-
cx_Freeze
尚未支持python 3.7,它有一个错误。存在一个错误文件但尚未发布,但是您可以手动应用它,查看可能是致命python错误的原因:initfsenceNing:无法加载文件系统编解码器?和CX_FREEZE撞击Python3.7.0。或者,如果您可以选择这一点,则可以回滚至Python 3.6。 -
动态导入的软件包以及DLL资源(
.dll
/.so
/.dylib
)通常不会自动包含cx_Freeze
,您需要告诉cx_Freeze
使用build_exe
选项packages
和include_files
。或者它们被包含在错误的地方(请参阅下一点)。 -
cx_Freeze
版本5.1.1(当前版本)将软件包冻结到构建目录的lib
子目录中,而主脚本目录中的主脚本和所有相关文件直接冻结到构建目录中。因此,软件包中的任何文件与主脚本的目录或冻结应用程序中可执行文件更改之间的相对路径(它将获得额外的lib/
)。这意味着,如果一个软件包尝试使用主应用程序目录中的相对路径找到位于软件包目录中的文件,反之亦然,则此机制将在冷冻应用程序中失败。浏览错误消息的堆栈跟踪,对于报告的每个文件,请检查此文件是否在构建目录中,以及冷冻应用程序是否在正确的位置寻找它。将"丢失"文件的手动副本根据需要在构建目录中或其lib
子目录中进行,直到工作。确定了文件的正确位置后,您可以将元组(source, destination)
用作include_files
列表中的项目,让cx_Freeze
在构建目录中包括从source
到特定destination
的文件。另请参阅使用cx_Freeze
文档中的数据文件的FAQ。
作为一般建议,将您的主脚本仅使用最小的GUI而不进一步的包装将您的主要脚本简化为最小的应用程序,并且可以使其在您的系统上工作。然后重新添加到包装和依赖项(图标,图片,声音,视频等),您需要一个一个,并检查每个步骤中未冻结和冷冻应用程序工作。