簡體   English   中英

用setup.py編譯python應用程序

[英]compile python application with setup.py

我已經指出了將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

盡管如此,構建文件夾已創建。 打開它時,我找到了指定的程序,但啟動后直接崩潰。 我在這里做錯了什么? 我懷疑它與包含的文件有關,但我無法理解。

由於我不知道環境,也沒有要測試的系統,因此我只能猜測安裝腳本可能存在的問題。

  1. cx_Freeze尚不支持Python 3.7,但有一個錯誤。 有一個錯誤修正,但尚未發布,但是您可以手動應用它,請參見致命python錯誤的可能原因:initfsencoding:無法加載文件系統編解碼器? Cx_freeze使Python3.7.0崩潰 或者,如果您願意的話,可以回滾到Python 3.6。

  2. 動態導入的軟件包以及DLL資源( .dll / .so / .dylib )通常不會自動被cx_Freeze包括在內,您需要使用build_exe選項packagesinclude_files告訴cx_Freeze包括它們。 否則它們會被包含在錯誤的位置(請參閱下一點)。

  3. cx_Freeze版本5.1.1(當前版本)將軟件包凍結在build目錄的lib子目錄中,而主腳本和該主腳本目錄中的所有相關文件都直接凍結在build目錄中。 因此,程序包中任何文件與主腳本或可執行文件目錄之間的相對路徑在凍結的應用程序中都會更改(它會獲得一個附加的lib/ )。 這意味着,如果程序包嘗試使用主應用程序目錄中的相對路徑查找位於程序包目錄中的文件,反之亦然,則此機制將在凍結的應用程序中失敗。 遍歷錯誤消息的堆棧跟蹤,對於每個報告丟失的文件,請檢查此文件是否在生成目錄中,以及凍結的應用程序是否在正確的位置查找它。 手動復制“丟失”的文件到構建目錄或lib子目錄中,直到可以使用為止。 一旦確定了文件的正確位置,就可以使用一個元組(source, destination)作為include_files列表中的項,以使cx_Freeze將文件從source到特定的destination cx_Freeze包括在構建目錄中。 另請參見cx_Freeze文檔中的FAQ使用數據文件

作為一般建議,僅使用最小的GUI而不使用其他軟件包,將主腳本減少到最小的應用程序,並使它在系統上運行。 然后,重新添加您需要的軟件包和依賴項(圖標,圖片,聲音,視頻等),並檢查未凍結和凍結的應用程序在每個步驟中是否正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM