Kivy中文編程指南:打包為 Mac 系統可執行文件
英文原文
特別注意
本文所提供的打包 Kivy 應用程序的方法必須在 OS X 系統內進行,而且不再支持 32 位平台。
使用 Buildozer
pip install git+http://github.com/kivy/buildozer cd /to/where/I/Want/to/package buildozer initn
(譯者註:這裡的/to/where/I/Want/to/package 就是你要打包的應用所在目錄。)
然後就還是修改 buildozer.spec 文件,在裡面添加好你的應用需要用到的信息。添加依賴包的位置在 requirements= 的那個位置。
默認情況下,requirements 位置所指定的 Kivy 版本會被忽略掉。
如果你在應用程序目錄下有 Kivy.app (/Applications/Kivy.app),那就會用這個來打包。如果沒有,還可以從 http://Kivy.org 下載最新版來用了。
如果你要用 Python3 來打包,就就直接從 http://Kivy.org 的下載頁面下載 Kivy3.7z 這個包,然後把它解壓縮到應用目錄 /Applications 下,命名為 Kivy.app,然後運行:
buildozer osx debugn
打包好應用之後,就可以移除用不上的包了,比如如果你不用視頻功能,那就可以去掉 gstreamer。同理,其他的用不上的功能,也都可以去掉,這就可以保證打包出來的應用能夠有盡量小的體積,足夠運行就好了。
作為示例,我們用這個方法打包好了一個應用,Python2 的版本大概 9MB 多一點,Python3 的是 15MB 左右,可以在官方提供的谷歌網盤下載來體驗一下。(譯者註:如果你身處大陸而無法訪問谷歌這種不存在的網站,那麼可以試試我的百度網盤分享。)
就這麼多,動手試試吧。
目前的 Buildozer 使用了 Kivy SDK 來打包你的應用程序。如果你想對你的程序進行更深入的修改定製,而 buildozer 不足以滿足你的需求,你可以試試直接使用 SDK,下面就要詳細介紹一下這部分。
使用 Kivy SDK
從 1.9.0 版本開始,Kivy 就開始發布針對 OS X 平台的自我包含的便捷包。
用下面描述的方法就可以使用 Kivy SDK 來打包和發布應用程序了,要添加一些諸如 SDL2 或者 GStreamer 之類的包也都更簡單了。
1 首先要確保有未修改過的原版 Kivy SDK,也就是從下載頁面獲取的 Kivy.app 這個文件。
2 然後運行下面的命令:
mkdir packagingncd packagingnpackaging> git clone https://github.com/kivy/kivy-sdk-packagernpackaging> cd kivy-sdk-packager/osxnosx> cp -a /Applications/Kivy.app ./Kivy.Appn
特別注意
上面這一步是至關重要的,一定要確保目錄和許可權都沒有問題。cp -rf 這樣的命令也能實現複製,但會讓應用程序無法運行,並且在後續步驟中導致各種錯誤。
3 接下來就是要把你用 Kivy.app 編譯好的應用程序包含進目標文件夾,使用如下命令:
osx> ./package-app.sh /path/to/your/app_folder_name>/n
就是你應用程序的名字。
這個命令會把 Kivy.app 複製成 .app,並把應用程序的一份編譯好的副本包含進去。
4 就這些了,你的應用程序已經打包完畢,可以拿出去安裝了。接下來可以按照下面的方法對你的應用進行更進一步的定製了。
安裝模塊
OS X 上的 Kivy 包郵自己的虛擬環境,當你使用 kivy 命令來運行的時候就會激活這個虛擬環境。如果要安裝額外的一些模塊,可以用如下命令:
kivy -m pip installn
模塊和文件安到哪了?
在 Kivy.app 這個文件內部,虛擬環境位置如下:
Kivy.app/Contents/Resources/venv/n
如果你安裝了一個安裝二進位的模塊,比如 kivy-garden。那麼這些二進位文件只能在虛擬環境中才是可用的,就比如你先運行了下面這個命令:
kivy -m pip install kivy-gardenn
然後安裝的 garden lib 就只在你激活這個虛擬環境的時候才可用。
source /Applications/Kivy.app/Contents/Resources/venv/bin/activate garden install mapview deactivaten
安裝二進位文件
這個比較簡單,就把二進位文件複製到虛擬目錄下的 bin 文件夾就可以了。(Kivy.app/Contents/Resources/venv/bin/)
包含其他框架
Kivy.app 已經自帶了 SDL2 和 Gstreamer 這兩個框架。要包含其他框架可以參考下面的方法:
git clone http://github.com/tito/osxrelocatornexport PYTHONPATH=~/path/to/osxrelocatorncd Kivy.appnpython -m osxrelocator -r . /Library/Frameworks/<Framework_name>.framework/ n@executable_path/../Frameworks/<Framework_name>.framework/n
Do not forget to replace with your framework. This tool osxrelocator essentially changes the path for the libs in the framework such that they are relative to the executable within the .app, making the Framework portable with the .app.
一定別忘了把上面樣例中的 替換成你要安裝的框架名字。osxrelocator 這個工具可以改變框架中的鏈接庫的路徑,這樣就能讓它們指向 .app 文件內的可執行文件,也就讓此框架成為 .app 文件內可用的內置框架了。
縮小應用體積
現在這個應用程序的體積可能已經相當大了,好在很多沒有用上的部分可以從包中移除。
舉例來說,如果你沒有使用 Gstreamer,就可以從你應用程序的 .app 文件內的 /Contents/Frameworks 目錄中把它刪除掉。類似的像是在 /Applications/Kivy.app/Contents/Resources/kivy/ 目錄下的 examples,tools,docs 等等這些文件夾都可以刪掉的。
這樣就可以讓你的包只包含你的應用程序用到的內容。
修改設置
通過修改應用程序的 .app 文件內 /Contents/info.plist 這個文件,就可以修改圖標和其他的設置了。
創建 DMG
用如下命令就可以創建一個 DMG 鏡像文件了:
osx> ./create-osx-dmg.sh YourApp.appn
一定要注意末尾沒有額外的 /。 這樣就能生成一個壓縮的 DMG 文件,能進一步縮小應用發布時候的體積了。
使用 PyInstaller,無 HomeBrew
首先是安裝 Kivy 和依賴包,不用 HomeBrew 的方法可以在官方文檔 或者譯者的博客或者譯者的專欄中查找。
安裝好了Kivy 以及依賴包之後,就需要安裝 PyInstaller 了。
(譯者註:PyInstaller 目前不支持 Python3.6,時間為2017-03-02。)
假設用一個名為 testpackaging 的文件夾:
cd testpackagingngit clone http://github.com/pyinstaller/pyinstallern
在這個目錄中創建一個名為 touchtracer.spec 的配置文件,然後添加如下的代碼到該文件中:
# -*- mode: python -*-nnblock_cipher = Nonenfrom kivy.tools.packaging.pyinstaller_hooks import get_deps_all, hookspath, runtime_hooksnna = Analysis([/path/to/yout/folder/containing/examples/demo/touchtracer/main.py],n pathex=[/path/to/yout/folder/containing/testpackaging],n binaries=None,n win_no_prefer_redirects=False,n win_private_assemblies=False,n cipher=block_cipher,n hookspath=hookspath(),n runtime_hooks=runtime_hooks(),n **get_deps_all())npyz = PYZ(a.pure, a.zipped_data,n cipher=block_cipher)nexe = EXE(pyz,n a.scripts,n exclude_binaries=True,n name=touchtracer,n debug=False,n strip=False,n upx=True,n console=False )ncoll = COLLECT(exe, Tree(../kivy/examples/demo/touchtracer/),n Tree(/Library/Frameworks/SDL2_ttf.framework/Versions/A/Frameworks/FreeType.framework),n a.binaries,n a.zipfiles,n a.datas,n strip=False,n upx=True,n name=touchtracer)napp = BUNDLE(coll,n name=touchtracer.app,n icon=None,n bundle_identifier=None)n
把路徑改到你的相對路徑:
a = Analysis([/path/to/yout/folder/containing/examples/demo/touchtracer/main.py],n pathex=[/path/to/yout/folder/containing/testpackaging],n...n...ncoll = COLLECT(exe, Tree(../kivy/examples/demo/touchtracer/),n
然後運行如下命令:
pyinstaller/pyinstaller.py touchtracer.specn
把這裡的 touchtracer 替換成你的應用名稱。之後就可以在 dist 文件夾下看到你的 .app 文件了。
使用 PyInstaller + HomeBrew
特別注意
打包你的應用程序的時候,你定要在你要兼容的最老版本的 OS X 系統上進行。
完整指南
1 安裝 Homebrew
2 安裝 Python:
brew install pythonn
特別注意
如果要用 Python3 ,就用 brew install python3 ,然後把下文中的 pip 改成 pip3 就可以了。
3 (Re)install your dependencies with --build-bottle to make sure they can be used on other machines:
brew reinstall --build-bottle sdl2 sdl2_image sdl2_ttf sdl2_mixern
特別注意
如果你的項目依賴 Gstreamer 或者其他的鏈接庫,一定要按照下文的方法添加 --build-bottle 來安裝。
4 安裝 Cython 和 Kivy:
pip install -I Cython==0.23nUSE_OSX_FRAMEWORKS=0 pip install -U kivyn
5 安裝 PyInstaller:
pip install -U pyinstallern
6 使用到 main.py 的路徑來打包應用:
pyinstaller -y --clean --windowed --name touchtracer n --exclude-module _tkinter n --exclude-module Tkinter n --exclude-module enchant n --exclude-module twisted n /usr/local/share/kivy-examples/demo/touchtracer/main.pynnn#### 特別注意nn這樣不能把額外的圖像和聲音文件複製進去。要添加這些內容還是要創建一個專門的`.spec`配置文件。nn### 編輯`.spec` 配置文件nn咱們用的這個配置文件是 touchtracer.spec , 位置在剛剛運行了 pyinstaller 的目錄。nn需要對配置文件中的 COLLECT() 調用的部分進行修改,要添加上 touchtracer 用到的資源(比如touchtracer.kv, particle.png,等等)。修改這一行,添加一個 Tree() 對象。這個 Tree 會搜索 touchtracer 目錄下的所有文件,並添加到你的包當中。 COLLECT 的那部分代碼應該大概如下所示:nnn```Bashncoll = COLLECT(exe, Tree(/usr/local/share/kivy-examples/demo/touchtracer/),n a.binaries,n a.zipfiles,n a.datas,n strip=None,n upx=True,n name=touchtracer)n
這樣會把需要的文件都添加進去,這樣 PyInstaller 就能包含需要用到的 Kivy 文件了。弄妥了之後,你的 spec 配置文件就可以執行了。
使用 spec 來構建並打包成 DMG
1 打開終端。
2 進入到 PyInstaller 的目錄,然後用如下命令進行構建:
pyinstaller -y --clean --windowed touchtracer.specn
3 運行來試試:
pushd distnhdiutil create ./Touchtracer.dmg -srcfolder touchtracer.app -ovnpopdn
4 然後就能在 dist 目錄下找到 Touchtracer.dmg 這個文件了。
額外的鏈接庫
GStreamer
如果你的項目需要 GStreamer,那就運行如下命令:
brew reinstall --build-bottle gstreamer gst-plugins-{base,good,bad,ugly}n
特別注意
如果你的項目需要對 Ogg Vorbis(音頻壓縮格式,類似於MP3,完全免費、開放和沒有專利限制,支持多聲道) 的支持,一定要在上面的命令後加上 --with-libvorbis。
如果你用的是通過 HomeBrew 安裝的 Python,那就還需要下面這一步,除非這個問題弄妥了:
brew reinstall --with-python --build-bottle https://github.com/cbenhagen/homebrew/raw/patch-3/Library/Formula/gst-python.rbn
推薦閱讀:
※Kivy 中文安裝指南(Mac系統)
※Kivy 中文安裝指南(Linux系統)
※Kivy中文編程指南:KV Android 詳細指南
※Kivy中文編程指南:整合其他框架