0

I already pointed at the problem of exporting my pygame into an executable for distribution purpose. I still have the problem that when I run the setup.py (I use python version 3.7.0) and build the app, the app directly crashes and I cannot open the unix executable either. Here is exactly what I did so far:

my 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)

when I run the setup.py to create stand-alone app via:

python setup.py bdist_mac

I get (many) error messages (cf. last 3 lines of terminal output):

> 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

or further above

> 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

Nevertheless, the build folder has been created. When opening it I find the specified program, but it directly crashes after starting it. What am I doing wrong here? I suspect it has something to do with the included files, but I am not able to make sense of it.

4

1 回答 1

1

由于我不知道环境,也没有任何系统要测试,我只能猜测你的安装脚本可能存在的问题。

  1. cx_Freeze尚不支持 Python 3.7,它有一个错误。存在错误修复但尚未发布,但是您可以手动应用它,请参阅致命 python 错误的原因可能是什么:initfsencoding:unable to load the file system codec? Cx_freeze 崩溃 Python3.7.0。或者,如果您愿意,也可以回滚到 Python 3.6。

  2. 动态导入的包和 DLL 资源 ( .dll// .so).dylib通常不会被自动包含cx_Freeze,您需要cx_Freeze使用build_exe选项packagesinclude_files. 或者他们被包含在错误的地方(见下一点)。

  3. cx_Freeze版本 5.1.1(当前版本)将包冻结到lib构建目录的子目录中,而主脚本和主脚本目录中的所有依赖文件直接冻结到构建目录中。因此,包中的任何文件与冻结的应用程序中的主脚本或可执行文件的目录之间的相对路径(它会获得额外的lib/)。这意味着如果一个包尝试使用主应用程序目录的相对路径查找位于包目录中的文件,反之亦然,则此机制将在冻结的应用程序中失败。查看错误消息的堆栈跟踪,并为每个报告丢失的文件检查该文件是否在构建目录中以及冻结的应用程序是否在正确的位置查找它。根据需要将“丢失”文件手动复制到构建目录或其lib子目录中,直到它工作为止。一旦确定了文件的正确位置,就可以使用元组(source, destination)作为include_files列表中的项目,以cx_Freeze将文件从source特定位置destination包含到构建目录中。另见常见问题解答 使用数据文件cx_Freeze文档中。

作为一般建议,将您的主脚本缩减为一个最小的应用程序,只使用一个最小的 GUI 并且没有进一步的包,并使其在您的系统上运行。然后重新添加您需要的包和依赖项(图标,图片,声音,视频......),并检查解冻和冻结的应用程序在每个步骤中是否正常工作。

于 2019-02-22T07:19:26.247 回答