冻结(freezing)您的代码¶
“冻结”您的代码是指创建单个可执行文件,以分发给包含所有程序代码以及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文件。
Windows¶
bbFreeze¶
前置要求是安装 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
py2exe¶
前置要求是安装了 Python on Windows。py2exe 的最后一个版本是从2014年开始的,且没有处于积极的开发中。
- 下载并且安装 http://sourceforge.net/projects/py2exe/files/py2exe/
- 编写
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。
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
选项。
Linux¶
bbFreeze¶
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()