在翻譯之前,譯者已根據原文成功建立了一個應用(Mac OS X 10.11.1, Python3.5),如讀者在操作中遇到問題,可在本文下方留言,共同探討。
原始碼下載:SandwichAPP
本教程中,我們將會使用 Python2 或 Python3 的Tkinter介面,結合py2app建立一個獨立的 OSX 應用。
“py2app 是一個讓你可以通過 Python 指令碼建立獨立應用包或外掛的 Python 安裝包命令。py2app 的設計與目的與 Windows 的 py2exe相似。”
與 py2app 相關的連結:
- 文件
- BitBucket 上的原始碼(最後提交時間:2015-05-05)
- 問題跟蹤,郵件列表
本指南沒有嚴格基於官方教程。我們基於一個 Sandwich.py
的 Python 檔案建立了一個名為 Sandwich.app
的應用。
前提
建立一個普通資料夾,並建立一個virtualenv環境:
1 2 3 4 5 6 7 |
# Create a custom directory $ mkdir SandwichApp $ cd SandwichApp # Use virtualenv to create an isolated environment $ virtualenv venv $ . venv/bin/activate |
現在,建立一個簡單的Tkinter應用,並其命名為 Sandwich.py
:
1 2 |
import sys if sys.version_info |
這個小應用是這個樣子:
安裝 py2app
原版的 py2app 由於 ModuleGraph 更新了版本產生了一個 bug。我 fork 了該工程,解決了 bug,然後放到了 Github。使用 pip 安裝 py2app:
1 |
$ pip install -U git+https://github.com/metachris/py2app.git@master |
建立 setup.py
檔案
py2app 包含了 py2applet
工具, 此工具可以幫你建立 setup.py 檔案:
1 2 |
$ py2applet --make-setup Sandwich.py Wrote setup.py |
setup.py
檔案是對應用的基本定義:
1 2 3 4 5 6 7 8 9 10 11 12 |
from setuptools import setup APP = ['Sandwich.py'] DATA_FILES = [] OPTIONS = {'argv_emulation': True} setup( app=APP, data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], ) |
如果你的應用使用的其他檔案,比如 JSON 檔案,文字檔案,圖片等,你應該將他們包含在 DATA_FILES
中。 例如:
1 |
DATA_FILES = ['testdata.json', 'picture.png'] |
建立開發版和測試版的應用
py2app 基於在 setup.py
檔案的定義建立獨立應用。
為了方法測試和開發,py2app 提供了“別名模式”,該模式通過與開發檔案象徵性的連結構建應用。
1 |
$ python setup.py py2app -A |
此命令建立瞭如下檔案和資料夾:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
. ├── build │ └── bdist.macosx-10.10-x86_64 │ └── python2.7-standalone │ └── app │ ├── Frameworks │ ├── collect │ ├── lib-dynload │ └── temp ├── Sandwich.py ├── dist │ └── Sandwich.app │ └── Contents │ ├── Info.plist │ ├── MacOS │ │ ├── Sandwich │ │ └── python -> /Users/chris/Projects/chris/python-gui/tkinter/env/bin/../bin/python │ ├── PkgInfo │ └── Resources │ ├── __boot__.py │ ├── __error__.sh │ ├── lib │ │ └── python2.7 │ │ ├── config -> /Users/chris/Projects/chris/python-gui/tkinter/env/bin/../lib/python2.7/config │ │ └── site.pyc -> ../../site.pyc │ ├── site.py │ └── site.pyc └── setup.py |
這並不是一個獨立的應用,並且通過別名模式構建的應用不適用於其他機器。
別名模式下構建的應用直接引用了原始碼檔案,所以任何對 Sandwich.py
檔案作的修改在應用下次啟動時會立刻生效。
位於 dist/Sandwich.app
的開發應用可以和其他 .app 應用一樣,在 Finder 中或通過 open 命令($ open dist/Sandwich.app
)啟動。你可以在終端執行如下命令啟動你的應用:
1 |
$ ./dist/Sandwich.app/Contents/MacOS/Sandwich |
構建釋出版應用
當測試通過後,你可以通過呼叫 python setup.py py2app
來生成釋出版。確保舊的 build
和 dist
檔案類都被刪除了:
1 2 |
$ rm -rf build dist $ python setup.py py2app |
此命令會將你的應用打包為 dist/Sandwich.app
。由於該應用是自包含的,在任意時刻,如果你修改了程式碼,資料檔案,選項等,你都可以再次執行 py2app 命令重新構建。
原版的 py2app 有一個 bug,會出現 “AttributeError: 'ModuleGraph' object has no attribute 'scan_code'
” 或者 load_module
。如果你遇到此錯誤,請參考 StackOverflow 或者使用我的 py2app fork。
此時此刻,最簡單的打包併發布應用的方法是在 Finder 中右擊該應用選擇“建立歸檔”。
新增一個圖示:
在 OPTIONS
字典中新增 "iconfile": "youricon.icns"
即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from setuptools import setup APP = ['Sandwich.py'] DATA_FILES = [] OPTIONS = { 'argv_emulation': True, 'iconfile': 'app.icns' } setup( app=APP, data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], ) |
你可以在網上找到 icns 格式的圖示(例如:IconFinder或者freepik)。
應用高階設定
你可以通過修改 Info.plist
來呼叫應用的資訊各行為。最完整的對可用的鍵的引用是Apple’s Runtime Configuratin Guidelines。
下面是一個有更多修改的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# -*- coding: utf-8 -*- from setuptools import setup APP = ['Sandwich.py'] APP_NAME = "SuperSandwich" DATA_FILES = [] OPTIONS = { 'argv_emulation': True, 'iconfile': 'app.icns', 'plist': { 'CFBundleName': APP_NAME, 'CFBundleDisplayName': APP_NAME, 'CFBundleGetInfoString': "Making Sandwiches", 'CFBundleIdentifier': "com.metachris.osx.sandwich", 'CFBundleVersion': "0.1.0", 'CFBundleShortVersionString': "0.1.0", 'NSHumanReadableCopyright': u"Copyright © 2015, Chris Hager, All Rights Reserved" } } setup( name=APP_NAME, app=APP, data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], ) |
通過設定,應用會擁有下面的資訊:
參考連結
其他連結
- 向 App Store 提交 Python 應用(dafoster.net)
- PyInstaller – 另一具建立跨平臺獨立應用的工具(全面支援 PyQt, Django 和 matplotlib)
- rumps – 簡單到難以致信的 Mac OS X 上的 Python 狀態列應用
- py2exe – Windows 平臺的 py2app
- cx_Freeze – 另一個建立 Windows 上 .exe 的工具包
- 在 Hacker News 上討論此話題