在 windows 上使用 nuitka 打包 Python 项目

Nuitka 是 Python 编译器,它是用 Python 编写,对 Python 解释器的无缝替换或扩展,兼容多个 CPython 版本,利用该工具可以对 Python 文件进行打包。本文用于介绍如何在 windows 上使用 nuitka 工具打包 Python,包含构建打包环境、安装 nuitka、测试打包。

安装 nuitka[1]

  1. 安装 C 编译器,有以下两个选择,任选一个安装
    • 根据系统配置,下载并安装 MinGW64,基于 gcc8.0 以上的版本,安装过程参考
    • 根据系统配置,下载并安装 Visual Studio 2019 以上的版本
  2. 下载并安装 Python,确保版本为:2.6、2.7 或 3.3、3.4、3.5、3.6、3.7、3.8、3.9 其中一个
  3. 使用以下命令安装 nuitka
1
python -m pip install nuitka

基础打包方式 [2]

新建文件 mdl.py,内容如下:

1
2
def printinfo(info):
print(info)

同目录下新建 main.py,内容如下:

1
2
3
4
from printinfo import printinfo

if __name__=='__main__':
printinfo('Hello nuitka')

测试运行无误后,运行以下命令

1
nuitka --output-dir=test hello.py

运行编译之后的 exe 程序,得到正确结果即安装完成

1
.\test\main.exe

生成文件说明

生成目录下,文件清理如下:

image-20210316145017152

  • 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 等。

v2-60fcfd5d427b443717c6efac3c3ffdad_r

图片来源:https://zhuanlan.zhihu.com/p/133303836

为什么不怕反编译

现有测试例子:

1
2
3
4
5
6
#mul.py
def mul(a):
return a*100

if __name__=='__main__':
print(mul(10))

使用以下命令调用 nuitka 打包该文件,得到以下目录

1
python -m nuitka mul.py

image-20210316152341393

从图片可以看出,.py 文件先转为.c 文件,随后被编译为.o 文件,最后链接生成.bin 文件

进行反编译时,以下路径无法走通,所以代码安全

  • ❌ bin->C
  • ❌ C->Python

以上将代码编译为可执行文件,还可以编译为动态库,使用以下命令生成动态库.os。

1
python -m nuitka --module mul.py

image-20210316153628788

从图片看出,调用该动态库的结果正确,但是无法查看源码

所以对动态库进行反编译时,以下路径走不通,进而代码安全

  • ❌ .so->C
  • ❌ C->Python

  1. Nuitka 入门指南 - 新手必备 - 知乎 ↩︎

  2. Nuitka User Manual ↩︎