“凍結”您的代碼是指創建單個可執行文件,以分發給包含所有程序代碼以及Python解釋器的終端用戶。
像“Dropbox”、“星戰前夜”、“文明4”和“BitTorrent 客戶端”都是如此。
進行這種分發的好處是您的用戶不需要安裝好所要求版本的Python(或其他)就可以運行您的應用程序。 在Windows上,甚至許多Linux發行版和OS X,特定的Python版本并不總是安裝好的。
此外,終端用戶軟件應始終是可執行的格式。 以 .py
結尾的文件適用于軟件工程師和系統管理員。
凍結的一個缺點是它會增加大約2-12MB的發行大小。另外,如果修補了Python的安全漏洞, 您將負責分發更新版本的應用程序。
打包您的代碼 是指把您的庫或工具分發給其他開發者。
在Linux 一個凍結的待選物是 創建一個Linux分發包 (比如,對于 Debian 或 Ubuntu 是 .deb文件,而對于 Red Hat 與 SuSE 是 .rpm 文件)
Todo
完善 “凍結您的代碼” 部分(stub)。
各解決方案的平臺/特性支持性
Solution |
Windows |
Linux |
OS X |
Python 3 |
License |
One-file mode |
Zipfile import |
Eggs |
pkg_resources support |
---|---|---|---|---|---|---|---|---|---|
bbFreeze |
yes |
yes |
yes |
no |
MIT |
no |
yes |
yes |
yes |
py2exe |
yes |
no |
no |
yes |
MIT |
yes |
yes |
no |
no |
pyInstaller |
yes |
yes |
yes |
yes |
GPL |
yes |
no |
yes |
no |
cx_Freeze |
yes |
yes |
yes |
yes |
PSF |
no |
yes |
yes |
no |
py2app |
no |
no |
yes |
yes |
MIT |
no |
yes |
yes |
yes |
Note
從Linux到Windows的凍結只有PyInstaller支持, 其余的。
Note
所有解決方案,除了py2app以外,需要在目標機器上安裝了Microsoft Visual C++ dll。
只有PyInstaller可通過傳遞 --onefile
到 Configure.py
中,
創建綁定了合適dll、可以自運行的exe文件。
前置要求是安裝 Python, Setuptools 以及 pywin32 的依賴項。
Todo
補充更多簡單的生成 .exe的步驟。
安裝 bbfreeze
:
$ pip install bbfreeze
編寫最基本的 bb_setup.py
from bbfreeze import Freezer
freezer = Freezer(distdir='dist')
freezer.addScript('foobar.py', gui_only=True)
freezer()
Note
這將適用于最基本的文件腳本。 要進行更高級的凍結,您必須提供包含和排除類似路徑
freezer = Freezer(distdir='dist', includes=['my_code'], excludes=['docs'])
(可選) 包含圖標
freezer.setIcon('my_awesome_icon.ico')
4. 為凍結器(freezer)提供Microsoft Visual C運行時DLL。 將Microsoft Visual Studio 路徑
附加您的 sys.path
中是可以的,但我發現在腳本所在同一文件夾中放 msvcp90.dll
則更加容易。
凍結!
$ python bb_setup.py
前置要求是安裝了 Python on Windows。py2exe 的最后一個版本是從2014年開始的,且沒有處于積極的開發中。
編寫 setup.py
(配置選項清單):
from distutils.core import setup
import py2exe
setup(
windows=[{'script': 'foobar.py'}],
)
$ python setup.py py2exe
6.提供Microsoft Visual C 運行時DLL。兩個選項: 在目標機器全局安裝dll 或者 與.exe一起分發dll。
PyInstaller可用于在Mac OS X 10.6(Snow Leopard)或更新版本上構建Unix可執行文件和 窗口應用程序。
要安裝PyInstaller, 使用pip:
$ pip install pyinstaller
要創建標準的Unix可執行文件, 使用 script.py
:
$ pyinstaller script.py
這會創建,
script.spec
文件, 類似于 make
文件
build
文件夾, 存放日志文件
dist
文件夾, 存放主要的可執行文件 script
,和一些依賴的Python庫
script.py
會把全部內容放在同一個文件夾中。PyInstaller將所有 script.py
用到的Python庫放到 dist
文件夾中。所以在分發可執行文件時,會分發整個 dist
文件夾。
script.spec
文件可以編輯成 自定義構建 ,
比如可以:
將數據文件與可執行文件綁定在一起
包含PyInstaller無法自動推斷的運行時庫( .dll
或 .so
文件)
將Python運行時選項添加到可執行文件中
現在:代碼 script.spec
可以用 pyinstaller
(而不是再次使用
script.py
)運行。
$ pyinstaller script.spec
要創建獨立的OS X窗口應用程序,請使用 --windowed
選項:
$ pyinstaller --windowed script.spec
這將在 dist
文件夾中創建一個代碼 script.app
。請確保在Python代碼中
使用GUI軟件包,例如 PyQt 或
PySide,來控制應用程序的圖形部分。
script.spec
有幾個與Mac OS X應用程序捆綁有關的 選項 。
例如,要指定應用程序的圖標,請使用 icon=\path\to\icon.icns
選項。
Warning
bbFreeze 僅在 Python 2.x 環境下工作, 根據以前的維護者的說法已不再進行維護。 如果您對此感興趣請查看 這里。
bbFreeze可以與所有已安裝Python以及pip2和/或easy_install的發行版一起使用。
對于pip2,請按以下內容進行:
$ pip2 install bbfreeze
而對于 easy_install,則:
$ easy_install bbfreeze
安裝好bbFreeze后,您就可以凍結應用程序了。
假設您有一個腳本,例如“hello.py”和名為“module.py”的模塊,并且您在里面使用了一個函數。 不費吹灰之力,您就可以通過凍結腳本的主要入口來凍結整個內容:
$ bbfreeze script.py
這樣,它就會創建一個名為dist/的文件夾,其中包含腳本的可執行文件以及Python腳本中使用的庫所需.so(共享對象)文件。
或者,您可以創建一個用于執行凍結的腳本。 凍結器的API可從以下庫中獲得:
from bbfreeze import Freezer
freezer = Freezer(distdir='dist')
freezer.addScript('script.py', gui_only=True) # 為使用GUI包的應用開啟參數 gui_only
freezer()