农夫山泉,喝起来有点甜;python应用,运行起来有点慢。但,除了慢,它就别无缺点了。
当你能根据pyc, pyd和平台动态库随意定制裁剪你的发行包时,你就出师了。打包是一个不断优化、不断瘦身的过程。
文章目录
前言
只有打包,才方便分发,才能流传后世。故此,颇有研究必要。
PyQt + pyinstaller成为一些中小项目界面包装和软件分发的优良选择。多快好省,省去很多烦恼。
打包主要是收集依赖,其次是形成正确的目录结构,最后才是包装成平台需要的可执行程序。
打包工具:PyInstaller,nuitka,cx_Freeze,PyOxidizer,PyInstaller-Qt,PyInstaller-PySide,Py2exe
首选pyinstaller,次选nuitka。pyinstaller打包速度快,但nuitka打包后的程序运行更快,代码更难被破解。nuitka打包会遇到各种问题,需要逐一解决,且首次打包速度比较慢。
python各种文件
- py: 源代码
- pyc:编译后的中间代码。Python源代码import后,编译生成的字节码,类似于java的class文件。例如__pycache__ 目录用于存放pyc
- pyo: 优化编译后的程序
- pyd: 文件是用Python 编写的动态链接库,可以在运行时由其他Python 代码运行。 它包含一个或多个Python 模块,便于代码重用,并为编写应用程序提供模块架构。pyd库可以被python调用,也可以被C或其它程序调用。ctypes.cdll.LoadLibrary()用于加载pyd文件。.pyd 文件一般是其他语言编写的 python 扩展模块,例如D语言。
Python程序分发思考
总体思路:根据需要,将不同库转成不同格式的文件,如pyc和pyd,然后由一个加载器统一记载。在pyinstaller里,这个加载器是bootloader。例如包含核心资产的代码编译成pyd,一些开源的第三方包转成pyc即可,这样加快编译速度。
- pyinstaller 打包, – 需要各平台单独打包。有反编译风险。
- 用 Cython 将 py 编译成 .pyd/.so ->在用 pyinstaller 进行打包 。 – 各平台单独打包分发、反编风险小
- pyarmor 是一个专业混淆代码库,也是编译成字节码然后用-> pyinstaller 打包分发 ---- 各平台单独打包分发、反编风最小
- Nuitka 直接使用 Clang 进行编译运行。
Cython
cythonize可以将py文件编译成pyd。
pip install Cython
cythonize -i -3 --directive always_allow_keywords=true xxx.py
python中调用pyd:
import ctypes
# 加载 Pyd 文件
mylib = ctypes.cdll.LoadLibrary('mylib.pyd')
# 调用 Pyd 文件中的函数
result = mylib.add(1, 2)
# 打印结果
print(result)
pyinstaller
pyinstaller目前是市面上主流的、老牌的打包工具,成熟稳定,美中不足的是打出的包体积有点大,启动有点慢&