冻结您的代码

../_images/33907151034_e0a9e53402_k_d.jpg

“冻结”您的代码正在创建一个可执行文件,以分发给最终用户,其中包含您的所有应用程序代码以及Python解释器。

像“Dropbox”、“Eve Online”、“文明四”和BitTorrent客户机这样的应用程序可以做到这一点。

以这种方式分发的好处是,即使用户尚未安装所需的Python版本(或任何版本),您的应用程序也将“正常工作”。在Windows上,甚至在许多Linux发行版和OS X上,都不会安装正确版本的python。

此外,最终用户软件应始终采用可执行格式。文件结束于 .py 适用于软件工程师和系统管理员。

冻结的一个缺点是它会将您的分发大小增加大约2-12MB。此外,当修补了python的安全漏洞时,您将负责发送应用程序的更新版本。

冻结替代品

Packaging your code 用于向其他开发人员分发库或工具。

在Linux上,冻结的另一种选择是 create a Linux distro package (例如,Debian或Ubuntu的deb文件,或Red Hat和Suse的.rpm文件。)

待处理

填写“冻结代码”存根

冻结工具比较

支持的解决方案和平台/功能:

解决方案

Windows

Linux系统

OS X

Python 3

许可

一个文件模式

压缩文件导入

鸡蛋

pkg_资源支持

bbFreeze

MIT

PY2Exe公司

MIT

PY安装程序

GPL

cx_Freeze

PSF

PY2APP公司

MIT

注解

pyinstaller只支持将Linux上的python代码冻结到Windows可执行文件中一次。 and later dropped .

注解

除了PY2APP之外,所有解决方案都需要微软Visual C++安装在目标机器上。只有pyinstaller生成一个自执行的exe,在传递时捆绑相应的dll --onefileConfigure.py .

Windows

bbFreeze

先决条件是安装 Python, Setuptools and pywin32 dependency on Windows .

  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')

第四章。为冰箱提供微软Visual C++运行时DLL。可能可以附加 sys.path 使用Microsoft Visual Studio路径,但我发现更容易删除 msvcp90.dll 在脚本所在的文件夹中。

  1. 别动!

$ python bb_setup.py

PY2Exe公司

先决条件是安装 Python on Windows .PY2Exe的最后一个版本是2014年。没有积极的发展。

  1. 下载并安装http://sourceforge.net/projects/py2exe/files/py2exe/

  2. setup.py (List of configuration options ):

from distutils.core import setup
import py2exe

setup(
    windows=[{'script': 'foobar.py'}],
)
  1. (可选) include icon

  2. (可选) one-file mode

  3. 生成 .exe 进入之内 dist 目录:

$ python setup.py py2exe
  1. 提供微软Visual C++运行时DLL。两种选择: globally install dll on target machinedistribute dll alongside with .exe .

OS X

PY2APP公司

PyInstaller

pyinstaller可用于在Mac OS X 10.6(雪豹)或更高版本上构建UNIX可执行文件和窗口应用程序。

要安装pyinstaller,请使用pip:

$ pip install pyinstaller

创建标准的Unix可执行文件,例如 script.py ,用途:

$ pyinstaller script.py

这将创建:

  • script.spec 文件,类似于 make 文件

  • build 文件夹,其中包含一些日志文件

  • dist 保存主可执行文件的文件夹 script 以及一些依赖的python库

全部在同一文件夹中 script.py .pyinstaller将使用的所有python库 script.py 进入 dist 文件夹,因此在分发可执行文件时,请分发整个 dist 文件夹。

这个 script.spec 文件可编辑为 customise the build ,选项包括:

  • 将数据文件与可执行文件绑定

  • 包括运行时库 (.dll.so 文件)pyinstaller无法自动推断

  • 向可执行文件添加python运行时选项

现在 script.spec 可与一起运行 pyinstaller (而不是使用 script.py 再说一遍):

$ pyinstaller script.spec

要创建独立窗口的OS X应用程序,请使用 --windowed 选项:

$ pyinstaller --windowed script.spec

这创造了一个 script.appdist 文件夹。确保在Python代码中使用GUI包,比如 PyQtPySide ,以控制应用程序的图形部分。

script.spec 与Mac OS X应用程序包相关 here .例如,要为应用程序指定图标,请使用 icon=\path\to\icon.icns 选择权。

Linux系统

bbFreeze

警告

bbfreeze将只在python 2.x环境中工作,因为它不再像以前的维护人员所说的那样进行维护。如果您对它感兴趣,请在 here .

bbfreeze可以与所有安装了python和pip2和/或easy-install的发行版一起使用。

对于PIP2,请使用以下内容:

$ pip2 install bbfreeze

或者,为了便于安装:

$ easy_install bbfreeze

安装bbfreeze后,就可以冻结应用程序了。

假设您有一个脚本,比如说“hello.py”和一个名为“module.py”的模块,其中有一个函数正在脚本中使用。不用担心,您可以请求冻结脚本的主入口点,它应该完全冻结:

$ bbfreeze script.py

通过这个,它创建了一个名为dist/的文件夹,其中包含脚本的可执行文件和必需的.so(共享对象)文件,这些文件与Python脚本中使用的库相链接。

或者,您可以创建一个脚本来为您执行冻结操作。可从以下库中获得冰柜的API:

from bbfreeze import Freezer

freezer = Freezer(distdir='dist')
freezer.addScript('script.py', gui_only=True) # Enable gui_only kwarg for app that uses GUI packages.
freezer()

PyInstaller

PyInstaller的使用方式与OSX中类似。安装方式与OSX部分中所示的方式相同。

不要忘记安装依赖项(如python和pip)以供使用。