Bootstrap

Python程序发布(打包)及pyInstaller、cx_Freeze工具使用介绍

##Python程序发布
Python程序发布时,通常包括以下三种形式:

  • py源码:即源程序代码,使用时需要Python执行环境(包含对应的依赖库)
  • pyc形式:由py文件编译生成,源码私密性提升、运行速度提升
  • 可执行文件:可直接运行的程序文件,不同平台(Mac/Linux/Windows…)下的格式不同,与平台强关联。无须额外下载依赖程序,指定平台下可直接使用

##Python程序打包成可执行程序工具比较
参考链接

SolutionWindowsLinuxOS XPython 3LicenseOne-file modeZipfile importEggspkg_resources support
bbFreezeyesyesyesnoMITnoyesyesyes
py2exeyesnonoyesMITyesyesnono
pyInstalleryesyesyesyesGPLyesnoyesno
cx_FreezeyesyesyesyesPSFnoyesyesno
py2appnonoyesyesMITnoyesyesyes

其中pyInstaller与cx_Freeze的通用性最强(全平台支持、支持Python3),故仅对这两种工具进行说明。对应工具的安装可直接使用pip search指令查询,并使用pip install 指令安装,本文不做多余描述

##pyInstaller

pyInstaller是指令+参数形式:

pyinstaller [options] script [script …] | specfile

执行上述指令后,会自动生成两个目录 build和dist,可执行文件包含在dist目录中,同时包含了其他打包的库。pyInstaller是支持 单文件模式(上表中的One-file mode) 的,可以通过-F 选项打包成单一可执行文件:

pyinstaller -F specfile

pyInstaller命令执行时,会自动生成一个.spec文件,用户可手动修改该文件,用于加强处理(譬如对相应的文件过滤等)。对应规则可参考 using-spec-files
然后使用指令:

pyinstaller specfile
pyi-build specfile

更详细的使用可以参考官方文档

##cx_Freeze
###cx_Freeze构建脚本
cx_Freeze建立在构建脚本(官方假设其名为setup.py),其基本格式为:

import sys
from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]}

# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "guifoo",
        version = "0.1",
        description = "My GUI application!",
        options = {"build_exe": build_exe_options},
        executables = [Executable("guifoo.py", base=base)])

在命令行中使用命令:

python setup.py build

该命令将在setup.py脚本同目录下生成一个 build 文件夹,其中包含了 setup.py中指定名称的可执行文件,同时包含了其他依赖的库等。
在Windows下可以使用如下指令生成安装文件(msi):

python setup.py bdist_msi

而在Mac OS X中,则可以使用如下指令生成对应的dmg安装文件:

python setup.py bdist_dmg

官方提供了若干依赖脚本示例 — Github地址
关于cx_Freeze中setup.py文件里的相关参数说明,可直接参考 官方文档,后续本文可能会对部分特殊的情况进行补充说明

###cx_Freeze脚本异常情况补充说明
部分异常及相应问题解决可参考如下链接:

用 cx_Freeze 将 Python 脚本编译为 Windows exe 实战

;