python实现打包exe有很多方案,主要有py2exe、cxfreeze、PyInstaller三种。

PyInstaller具有以下缺点:
它会把Python运行时和依赖的库打包进来。这对程序员来说没有任何意义,因为他们本来就装了环境,不需要再冗余一份
打包的环境不能正常更新,任何改动都必须整体重新打包一遍
打包后不能跨平台,且不能交叉编译
体积大(相对库本身来说)

安装pyinstaller

pip install pyinstaller

pyinstaller相关参数

-D, --onedir:打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护
-F, --onefile:打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用
–specpath DIR:用于存储生成的规范文件的文件夹(默认:当前目录)
-n NAME, --name NAME:分配给捆绑的应用程序和规范文件的名称(默认值:第一个脚本的基本名称)
-h, --help:显示此帮助消息并退出
-v, --version:显示程序版本信息并退出。
–distpath DIR:捆绑应用的放置位置(默认值:./ dist)
–workpath WORKPATH:所有临时工作文件,.log,.pyz等的放置位置(默认值:./ build)
-y, --noconfirm:替换输出目录(默认值:SPECPATH / dist / SPECNAME)而不要求确认
–upx-dir UPX_DIR:UPX实用程序的路径(默认值:搜索执行路径)
-a, --ascii:不包括unicode编码支持(默认值:如果可用,则包括在内)
–clean:在构建之前,请清理PyInstaller缓存并删除临时文件。
–log-level LEVEL:生成时控制台消息中的详细信息量。LEVEL可能是TRACE,DEBUG,INFO,WARN,ERROR,CRITICAL(默认值:INFO)之一。
–add-data <SRC;DEST or SRC:DEST>:要添加到可执行文件中的其他非二进制文件或文件夹。路径分隔符是特定于平台的os.pathsep(;在Windows和:大多数Unix系统上使用)。此选项可以多次使用。
–add-binary <SRC;DEST or SRC:DEST>:要添加到可执行文件的其他二进制文件。此选项可以多次使用。
-p DIR, --paths DIR:搜索导入的路径(例如使用PYTHONPATH)。允许使用多个路径,以“:”分隔,或多次使用此选项
–hidden-import MODULENAME, --hiddenimport MODULENAME:命名在脚本代码中不可见的导入。此选项可以多次使用。
–collect-submodules MODULENAME:从指定的包或模块中收集所有子模块。此选项可以多次使用。
–collect-data MODULENAME, --collect-datas MODULENAME:从指定的包或模块收集所有数据。此选项可以多次使用。
–collect-binaries MODULENAME:从指定的包或模块收集所有二进制文件。此选项可以多次使用。
–collect-all MODULENAME:从指定的包或模块中收集所有子模块、数据文件和二进制文件。此选项可以多次使用。
–copy-metadata PACKAGENAME:复制指定包的元数据。此选项可以多次使用。
–recursive-copy-metadata PACKAGENAME:复制指定包及其所有依赖项的元数据。此选项可以多次使用。
–additional-hooks-dir HOOKSPATH:搜索钩子的其他路径。此选项可以多次使用。
–runtime-hook RUNTIME_HOOKS:定制运行时挂钩文件的路径。运行时挂钩是与可执行文件捆绑在一起的代码,该代码在执行任何其他代码或模块之前执行以设置运行时环境的特殊功能。此选项可以多次使用。
–exclude-module EXCLUDES:可选模块或包(Python名称,而不是路径名),将被忽略(好像未找到)。此选项可以多次使用。
–key KEY:用于加密Python字节码的密钥
–splash IMAGE_FILE
-d {all,imports,bootloader,noarchive}, --debug {all,imports,bootloader,noarchive}:提供调试冻结应用程序的帮助。可以多次提供此参数以选择以下几个选项。

  • all:以下三个选项。
  • imports:指定基础Python解释器的-v选项,使该模块在每次模块初始化时打印一条消息,显示加载该文件的位置(文件名或内置模块)。
  • noarchive:不要将所有冻结的Python源文件作为档案存储在生成的可执行文件中,而应将它们作为文件存储在生成的输出目录中。

–python-option PYTHON_OPTION
-s, --strip:将符号表条应用于可执行文件和共享库(对于Windows不建议)
–noupx:即使可用,也不要使用UPX(Windows和* nix之间的工作方式不同)
–upx-exclude FILE:防止在使用upx时压缩二进制文件。如果upx在压缩过程中破坏了某些二进制文件,通常使用此方法。FILE是没有路径的二进制文件名。此选项可以多次使用。
-c, --console, --nowindowed:打开用于标准I / O的控制台窗口(默认)。在Windows上,如果第一个脚本是“ .pyw”文件,则此选项无效。
-w, --windowed, --noconsole:Windows和Mac OS X:不提供标准I / O的控制台窗口。在Mac OS X上,这也会触发构建OS X .app捆绑软件。在Windows上,如果第一个脚本是“ .pyw”文件,则将设置此选项。在* NIX系统中,此选项被忽略。
-i <FILE.ico or FILE.exe,ID or FILE.icns or Image or “NONE”>, --icon <FILE.ico or FILE.exe,ID or FILE.icns or Image or “NONE”>:FILE.ico:将该图标应用于Windows可执行文件。FILE.exe,ID,从exe中提取具有ID的图标。FILE.icns:将图标应用于Mac OS X上的.app捆绑包
–version-file FILE:从FILE向exe添加版本资源
-m , --manifest :将清单文件或XML添加到exe
-r RESOURCE, --resource RESOURCE:向Windows可执行文件添加或更新资源。资源是一到四个项目,FILE [,TYPE [,NAME [,LANGUAGE]]]。FILE可以是数据文件或exe / dll。对于数据文件,至少必须指定TYPE和NAME。LANGUAGE默认为0,或者可以指定为通配符*,以更新给定TYPE和NAME的所有资源。对于exe / dll文件,如果省略TYPE,NAME和LANGUAGE或将其指定为通配符*,则FILE中的所有资源都将添加/更新为最终可执行文件。此选项可以多次使用。
–uac-admin:使用此选项将创建一个清单,它将在应用程序重新启动时请求提升。
–uac-uiaccess:使用此选项可以使提升的应用程序与远程桌面一起使用。

打包

有两种模式:文件夹模式onedir和单文件模式onefile

文件夹模式onedir

默认方式,使用命令:pyinstaller fileren.py

执行完命令后,在项目文件夹下多出了三个文件,build,dist和fileren.spec、_pycache_。

  • build文件夹用于存储日志文件。
  • dist文件夹储存可执行文件即相关依赖。
  • __pycache__文件夹里是Python版本信息。
  • fileren.spec打包的配置文件,可以配置依赖资源。

除了dist文件夹,其它都可以删除,没什么用。
这种模式下,需要把整个dist文件夹发给别人才能运行。

单文件模式onefile

加上-F参数,全部的依赖文件都会被打包到exe文件中,在dist文件夹中只有一个可执行文件,把这个可执行文件发给别人就可以直接运行了。pyinstaller -w -F fileren.py

SPEC打包

后续打包的参数越来越多,每次输入一大堆参数显然不如直接使用spec来的高效,所以尽量使用spec文件进行打包操作。

pyinstaller -D xxx.spec 

spec内容说明

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(['..\\app2.py'],
             pathex=['D:\\A\\DXK_YHSJ_CODE\\package'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             hooksconfig={},
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)

exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,  
          [],
          name='app2',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True,
          disable_windowed_traceback=False,
          target_arch=None,
          codesign_identity=None,
          entitlements_file=None , icon='..\\resource\\image\\appIcon.ico')

变量含义
aAnalysis类的实例,要求传入各种脚本用于分析程序的导入和依赖。a中内容主要包括以下四部分:scripts,即可以在命令行中输入的Python脚本;pure,程序代码文件中的纯Python模块,包括程序的代码文件本身;binaries,程序代码文件中需要的非Python模块,包括–add-binary参数指定的内容;datas,非二进制文件,包括–add-data参数指定的内容。
pyzPYZ的实例,是一个.pyz文件,包含了所有pure中的所有Python模块。
exeEXE类的实例,这个类是用来处理Analysis和PYZ的结果的,也是用来生成最后的exe可执行程序。
collCOLLECT类的实例,用于创建输出目录。在-F模式下,是没有COLLECT实例的,并且所有的脚本、模块和二进制文件都包含在了最终生成的exe文件中。
block_cipher加密密钥

以上内容中 修改比较多的是a、exe的内容,coll和pyz基本没有遇到需要修改的情况。

参数含义
Analysis参数scripts也是第一个参数,它是一个脚本列表,可以传入多个py脚本,效果与命令行中指定多py文件相同,即py文件不止一个时,比如“pyinstaller xxx1.py xxx2.py”,pyinstaller会依次分析并执行,并把第一个py名称作为spec和dist文件下的文件夹和程序的名称
Analysis参数pathex默认有一个spec的目录,当我们的一些模块不在这个路径下,记得把用到的模块的路径添加到这个list变量里。同命令“-p DIR/–paths DIR”.
Analysis参数datas作用是将本地文件打包时拷贝到目标路径下。datas是一个元素为元组的列表,每个元组有两个元素,都必须是字符串类型,元组的第一个元素为数据文件或文件夹,元组的第二个元素为运行时这些文件或文件夹的位置。例如:datas=[(’./src/a.txt’, ‘./dst’)],表示打包时将"./src/a.txt"文件添加(copy)到相对于exe目录下的dst目录中。也可以使用通配符:datas= [ (’/mygame/sfx/*.mp3’, ‘sfx’ ) ],表示将/mygame/sfx/目录下的所有.mp3文件都copy到sfx文件夹中。也可以添加整个文件夹:datas= [ (’/mygame/data’, ‘data’ ) ],表示将/mygame/data文件夹下所有的文件都copy到data文件夹下。同命令“–add-data”。
Analysis参数binaries添加二进制文件,也是一个列表,定义方式与datas参数一样。没具体使用过。同命令“–add-binary”。
Analysis参数hiddenimports指定脚本中需要隐式导入的模块,比如在__import__、imp.find_module()、exec、eval等语句中导入的模块,这些模块PyInstaller是找不到的,需要手动指定导入,这个选项可以使用多次。同命令“–hidden-import MODULENAME/–hiddenimport MODULENAME”。
Analysis参数hookspath指定额外hook文件(可以是py文件)的查找路径,这些文件的作用是在PyInstaller运行时改变一些Python或者其他库原有的函数或者变量的执行逻辑(并不会改变这些库本身的代码),以便能顺利的打包完成,这个选项可以使用多次。同命令“–additional-hooks-dir HOOKSPATH”。
Analysis参数runtime_hooks指定自定义的运行时hook文件路径(可以是py文件),在打好包的exe程序中,在运行这个exe程序时,指定的hook文件会在所有代码和模块之前运行,包括main文件,以满足一些运行环境的特殊要求,这个选项可以使用多次。同命令“–runtime-hook RUNTIME_HOOKS”。
Analysis参数excludes指定可以被忽略的可选的模块或包,因为某些模块只是PyInstaller根据自身的逻辑去查找的,这些模块对于exe程序本身并没有用到,但是在日志中还是会提示“module not found”,这种日志可以不用管,或者使用这个参数选项来指定不用导入,这个选项可以使用多次。同命令“–exclude-module EXCLUDES”。
exe参数console设置是否显示命令行窗口,同命令-w/-c。
exe参数icon设置程序图标,默认spec是没有的,需要手动添加,参数值就是图片路径的字符串。同命令“命令-i/–icon”。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐