在 windows 上使用 nuitka 打包 Python 项目
Nuitka 是 Python 编译器,它是用 Python 编写,对 Python 解释器的无缝替换或扩展,兼容多个 CPython 版本,利用该工具可以对 Python 文件进行打包。本文用于介绍如何在 windows 上使用 nuitka 工具打包 Python,包含构建打包环境、安装 nuitka、测试打包。
安装 nuitka[1]
- 安装 C 编译器,有以下两个选择,任选一个安装
- 下载并安装 Python,确保版本为:2.6、2.7 或 3.3、3.4、3.5、3.6、3.7、3.8、3.9 其中一个
- 使用以下命令安装 nuitka
1 | python -m pip install nuitka |
基础打包方式 [2]
新建文件 mdl.py,内容如下:
1 | def printinfo(info): |
同目录下新建 main.py,内容如下:
1 | from printinfo import printinfo |
测试运行无误后,运行以下命令
1 | nuitka --output-dir=test hello.py |
运行编译之后的 exe 程序,得到正确结果即安装完成
1 | .\test\main.exe |
生成文件说明
生成目录下,文件清理如下:
- main.build nuitka 打包过程的中间文件,可删除
- main.exe nuitka 打包得到的可执行文件
- python37.dll Pyhton 安装目录下的 python37.dll 的拷贝,代码使用的库包依靠该文件去查找
打包原理
nuitka 作为一个打包工具,实现了工具的跨平台,Windows 和 Linux 下都能对 python 文件进行打包,nuitka 只能打包 python 文件(也就是.py 文件),对其他格式的文件无法打包。在 Windows 下最终打包成一个.exe 文件,Linux 下打包成 Linux 执行档。
nuitka 的工作原理是把 python 代码编译成 C 代码,再把 C 代码编译成可执行文件,生成的文件不能像.pyc 文件一样反编译;针对未打包的 Pyhton 代码,通过动态链接 pythonxx.dll
链接到系统的 Python 环境上,进而使用系统中安装的库包,如:tensorflow,numpy,cv2 等。
为什么不怕反编译
现有测试例子:
1 | #mul.py |
使用以下命令调用 nuitka 打包该文件,得到以下目录
1 | python -m nuitka mul.py |
从图片可以看出,.py 文件先转为.c 文件,随后被编译为.o 文件,最后链接生成.bin 文件
进行反编译时,以下路径无法走通,所以代码安全
- ❌ bin->C
- ❌ C->Python
以上将代码编译为可执行文件,还可以编译为动态库,使用以下命令生成动态库.os。
1 | python -m nuitka --module mul.py |
从图片看出,调用该动态库的结果正确,但是无法查看源码
所以对动态库进行反编译时,以下路径走不通,进而代码安全
- ❌ .so->C
- ❌ C->Python