Loading... > 使用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文件 5. 如果有启动不了,取消`-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.py`、`xxx2.py`为想要生成pyd的py文件。 2. 编译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 ``` 3. 命令行启动打包后的exe文件,根据提示信息进行排错即可: ``` cmd /k xxx.exe ``` > `/k`:让命令行窗口一直保持而不自动关闭。 Last modification:December 22, 2020 © Allow specification reprint Like