使用Cython、pyinstaller进行打包。

其实我是想用 Nuitka来打包的,但是报错一直解决不了,于是放弃了。

浅谈打包

打包的目的:

  1. 生成exe可执行文件,方便他人使用
  2. 编译后再打包,加快运行速度,提高反编译难度

打包的流程:

  1. 使用Cython将除入口文件外的py文件编译为pyd文件
  2. 修改pyd文件的文件名,使之除了后缀pyd与源文件py不同,其他都一致
  3. 在入口的py文件中import其他py文件所有import的包
  4. 使用pyinstaller进行打包
pyd的优先级高于py,打包时pyinstaller会自动选择编译后的pyd文件而非py文件
  1. 如果有启动不了,取消-w参数进行打包,通过命令行启动排错

使用Cython将py文件编译为pyd文件

此处有一个坑就是不能将入口的py文件也生成pyd,否则pyinstaller打包时会提示:

ValueError: Module file XXX.py is missing
  1. 创建build_pyd.py文件:
from distutils.core import setup
from Cython.Build import cythonize

setup(
    name='words you want',
    ext_modules=cythonize(["xxx1.py", "xxx2.py"], language_level=3),
)
xxx1.pyxxx2.py为想要生成pyd的py文件。
  1. 编译py文件:
python build_pyd.py build_ext --inplace

使用pyinstaller进行打包

  1. 在入口的py文件中import其他py文件所有import的包
  2. 开始打包:

打包为文件夹:

pyinstaller -D -w -i xxx.ico xxx.py

打包为单文件:

pyinstaller -F -D -w -i xxx.ico xxx.py

xxx.ico为打包后文件的图标,不需要可以将 -i xxx.ico去掉

xxx.py为入口的py文件

-w:不显示命令行窗口

排错

  1. 删除打包生成的所有目录及其文件:

    1. bulid目录
    2. dist目录
    3. xxx.spec文件
  2. 重新打包,不要使用-w参数:
pyinstaller -D -i xxx.ico xxx.py

或者

pyinstaller -F -D -i xxx.ico xxx.py
  1. 命令行启动打包后的exe文件,根据提示信息进行排错即可:
cmd /k xxx.exe
/k:让命令行窗口一直保持而不自动关闭。
Last modification:December 22, 2020