冻结代码
『冻结』你的代码是指创建单个可执行文件,文件里包含所有程序代码以及 Python 解释器。
像 Dropbox、星战前夜、文明 4 和 BitTorrent 客户端都是如此。
进行这种分发的好处是你的用户不需要安装所要求的 Python 版本(或其他)即可直接运行你的应用程序。 在 Windows 上,甚至许多 Linux发行版和 OS X,系统自带的 Python 版本总是不尽如人意,此时这种分发方式就会体现其价值。
此外,终端用户软件应始终是可执行的格式。 以 .py
结尾的文件一般适用于软件工程师和系统管理员。
冻结的一个缺点是它会增加大约 2-12 MB 的发行大小。另外,如果修补了 Python 的安全漏洞, 你将需要独立负责更新分发的应用程序。
冻结的替代方案
打包你的代码 是指把你的库或工具分发给其他开发者。
Linux 下一个冻结的替代品是 Linux 分发包 (比如,对于 Debian 或 Ubuntu 是 .deb文件,而对于 Red Hat 与 SuSE 是 .rpm 文件)
冻结工具的比较
解决方案还有平台/特性支持性:
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 |
注意:在 Linux 下冻结 Windows 安装包,之前只有 PyInstaller 支持,不过后来也是 停止支持了。
注意:所有解决方案都需要在 Windows 目标机器上安装了MS Visual C++ dll,除了 py2app 以外。只有 Pyinstaller 支持创建独立运行的绑定了dll 的 exe 文件,你需要在创建时传递参数
--onefile
到Configure.py
。
Windows 下的解决方案
bbFreeze
前置要求是安装 Python, Setuptools 以及 pywin32 的依赖项。
1.使用以下命令安装 bbfreeze
:
$ pip install bbfreeze
2.编写最简单的示例 bb_setup.py
:
from bbfreeze import Freezer
freezer = Freezer(distdir='dist')
freezer.addScript('foobar.py', gui_only=True)
freezer()
注意这将适用于最基本的文件脚本。 有时候你需要高级的用法,如包含或者排除某些路径,如下:
freezer = Freezer(distdir='dist', includes=['my_code'], excludes=['docs'])
3.(可选) 包含图标
freezer.setIcon('my_awesome_icon.ico')
4.为冻结器(freezer)提供 Microsoft Visual C 运行时 DLL,我们有一般有两种方法,第一种是将Microsoft Visual Studio 路径 附加您的 sys.path
中,第二种是在脚本所在同一文件夹中放置 msvcp90.dll
文件。
5.开始冻结!
$ python bb_setup.py
py2exe
前置要求是安装了 Python on Windows。
1.下载并且安装 http://sourceforge.net/projects/py2exe/files/py2exe/
2.编写 setup.py
(配置选项清单):
from distutils.core import setup
import py2exe
setup(
windows=[{'script': 'foobar.py'}],
)
3.(可选) 包含图标
4.(可选) 单文件模式
5.生成 :file: .exe
到 dist
目录:
$ python setup.py py2exe
6.两种方式来提供 Microsoft Visual C 运行时 DLL。两个选项: 在目标机器全局安装 dll 或者 与 .exe 一起分发 dll。
PyInstaller
前置条件是安装 Python, Setuptools 以及pywin32 依赖项.
OS X
py2app
PyInstaller
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
选项。