Menu

7.2. 冻结代码

file

『冻结』你的代码是指创建单个可执行文件,文件里包含所有程序代码以及 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
  1. 编写最简单的示例  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'])

  1. (可选) 包含图标
freezer.setIcon('my_awesome_icon.ico')
  1. 为冻结器(freezer)提供 Microsoft Visual C 运行时 DLL,我们有一般有两种方法,第一种是将Microsoft Visual Studio 路径 附加您的 sys.path 中,第二种是在脚本所在同一文件夹中放置 msvcp90.dll 文件。

  2. 开始冻结!
$ 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'}],
)
  1. (可选) 包含图标
  2. (可选) 单文件模式
  3. 生成 :file: .exe 到 dist 目录:
$ python setup.py py2exe
  1. 两种方式来提供 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 选项。

Linux

bbFreeze

PyInstaller

本文章首发在 PythonCaff
上一篇 下一篇
讨论数量: 0
发起讨论


暂无话题~