pyinstaller spec 文件浅谈

python程序打包系列

接着上篇的pyinstaller的使用,在使用pyinstaller的过程中会生成一个spec文件,现在我们来聊聊这个文件。

文章目录


spec 官方文档介绍

PyInstaller要做的第一件事是建立一个spec(规范)文件 myscript.spec。该文件存储在–specpath=目录中,默认情况下为当前目录。

规范文件告诉PyInstaller如何处理脚本。它对脚本名称和您提供给pyinstaller命令的大多数选项进行编码。spec文件实际上是可执行的Python代码。 PyInstaller通过执行spec文件的内容来构建应用程序。

对于PyInstaller的许多用途,您无需检查或修改规范文件。通常只需给命令提供所有必需的信息(例如隐藏的导入)作为选项pyinstaller并让其运行。

在四种情况下,修改规格文件很有用:

  • 当您要将数据文件与应用程序捆绑在一起时。
  • 当您想要包括运行时库(.dll或.so文件)时, PyInstaller不会从任何其他来源得知。
  • 当您要将Python运行时选项添加到可执行文件时。
  • 当您要创建具有合并的通用模块的多程序包时。

您可以使用以下命令创建规格文件:

pyi-makespec 选项 [其他脚本…]name.py

这些选项与上面为pyinstaller命令记录的选项相同。此命令创建文件,但不会继续生成可执行文件。name.spec

创建规范文件并根据需要对其进行修改后,可以通过将规范文件传递给pyinstaller命令来构建应用程序:

pyinstaller 选项 name.spec

创建规格文件时,大多数命令选项都编码在规格文件中。从规格文件构建时,这些选项无法更改。如果在命令行中给出它们,它们将被忽略,并由spec文件中的选项代替。

从规范文件构建时,只有以下命令行选项有效:

  • –upx-dir=
  • –distpath=
  • –workpath=
  • –noconfirm
  • –ascii
  • –clean
  • –key=

我在打包的过程中用到的参数
以上参数:
–upx-dir=:要用到一个压缩程序UPX,用于压缩文件,需要单独下载。
–noconfirm:表示不再询问,会自动覆盖上次打包的内容
–key= :加密,需要安装tinyaes第三方库,最多16位字符

默认打包方式生成的spec文件内容大致如下:

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

block_cipher = None # 此处在使用--key= 会有变化


a = Analysis(['ai\\main.py'],
             pathex=['C:\\Users\\Admin\\Downloads\\marsai-master'],
             binaries=[],
             datas=[],# 此处可以添加静态资源,例如你有个图片文件夹imgs,可以这样写[('imgs','imgs'),('test.txt','.')],打包以后会有一个一样的文件夹,点表示当前文件夹。
             hiddenimports=[],
             hookspath=[],
             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,
          [],
          exclude_binaries=True,
          name='main', # 生成的exe的名字
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True, # 打包的时候进行压缩,False表示不压缩
          console=True # 是否显示黑窗口,刚开始打包的时候一般都会有问题,建议设为True,解决所有问题后可以设置为False)
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name='main' # 文件夹的名字)

最后,有任何关于打包的问题可以评论留言,大家一起交流学习。

上一篇:【原创】Cypress Vue CLI前端自动化测试自学与项目实践


下一篇:利用pyinstaller将python项目脚本打包成可执行文件