使用setup.py编译python应用程序

问题描述 投票:0回答:1

我已经指出了将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

但是,已创建构建文件夹。打开它时,我找到了指定的程序,但它在启动后直接崩溃。我在这做错了什么?我怀疑它与包含的文件有关,但我无法弄清楚它。

python pygame cx-freeze python-standalone
1个回答
1
投票

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

  1. cx_Freeze尚不支持Python 3.7,它有一个bug。存在错误修复但尚未发布,但您可以手动应用它,请参阅What could be the reason for fatal python error:initfsencoding:unable to load the file system codec?Cx_freeze crashing 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_Freezesource中的文件包含到构建目录中的特定destination中。另请参阅FAQ Using data files文档中的cx_Freeze

作为一般建议,只需使用最少的GUI而不使用其他软件包,将主脚本减少到最小的应用程序,并使其在您的系统上运行。然后重新添加您需要的软件包和依赖项(图标,图片,声音,视频......),并检查解冻和冻结的应用程序是否在每个步骤都有效。

© www.soinside.com 2019 - 2024. All rights reserved.