【问题标题】:compile python application with setup.py使用 setup.py 编译 python 应用程序
【发布时间】:2019-07-14 01:37:55
【问题描述】:

我已经指出了将我的 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. cx_Freeze 还不支持 Python 3.7,它有一个错误。存在错误修复但尚未发布,但是您可以手动应用它,请参阅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_Freeze 包含从 source 到特定 destination 的文件到构建目录中。另请参阅cx_Freeze 文档中的FAQ Using data files

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

    【讨论】:

    • @gero 我希望这个答案能给你一些关于如何继续的提示。如果您仍然无法解决您的问题,请将您的主脚本缩减为 minimal reproducible example 并将此代码添加到您的问题中。然后我会尽力提供进一步的帮助。
    • 非常感谢!我将尝试每个步骤,并希望能够连续调试冻结过程 - 我会让你知道当时的问题是什么
    猜你喜欢
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多