Nuitka,100%兼容标准python2/python3,静态编译你的python程序
1. 概述
Nuitka(nuitka.net)可以将python代码转换为C++,然后编译为可执行文件,其通过直接调用python的api的方式实现从解析语言到编译语言的转换,并且在转换到C++的过程中直接使用python的解释器,可以保证100%的语法兼容,作者宣称100%通过了python的测试用例,作者也宣称可以加速python代码0%~258%。
对比于cx_freeze/py2exe等打包工具,Nuitka则是完全的编译工具,编译后的可执行文件已经不需要字节码解释了,从这点看,已经很像VB6程序依赖于msvbvm60.dll一样了,都是调用dll内的api实现各种功能。
并且nuitka相比cython更帅气的一点是:享受编译福利的同时,你不需要和动态行为说再见。
2. 安装
首先到官网上根据你的python版本下载对应的nuitka安装包,直接执行安装即可,如果安装完成后系统环境变量中没有nuitka安装目录,建议添加。
其次要实现编译,得需要一个编译环境,在windows环境下可以安装微软的VS套件(至少是VS2012,VC6是编译不过的),或者按照MinGW(推荐,小巧,编译速度比VS快)。
安装完编译环境后,要将其bin目录添加到系统的环境变量,以便nuitka调用。
3.编译
直接调用
nuitka –exe yourmodule.py
复制代码
则编译生成yourmodule.exe,试一下直接执行吧。
如果要完全脱离python环境,可以使用命令行
nuitka –exe –recurse-all –standalone –mingw –icon=app_icon.ico yourmodule.py
复制代码
则会将所有依赖的包全部编译然后链接成一个单一的exe文件(依赖的pyd和dll无法链接,会拷贝到目标文件夹)
编译过程很慢,要有耐心!而且目标文件会比较大,要有心理准备。
一般情况下Nuitka生成的exe会比cx_freeze等打包后的exe要大不少,不过现在的计算机不用在乎这一点大小了吧。
4.nuitka的一些问题
尽管nuitka已经很稳定了,但是软件都是有bug的,我这里就列出几个我遇到的
1.python3+pyqt无法脱离python使用
此问题是nuitka不够智能,没有将pyqt所有的依赖都拷贝到目标文件夹所致,所以你要手工拷贝如下文件或目录:
sip.pyd,libEGL.dll,plugins\imageformats\,plugins\platforms\
2.dll/pyd过多
nuitka会将所有依赖的dll都拷贝到目标文件夹,而不管是否是系统标准dll,这样导致目标文件夹很多dll文件,所以编译完成后你可以手动删除这些dll,可能还有一些pyd文件是程序不需要的,也可以删除。
3.无法方便获取当前运行目录
打包工具都会将sys.executable设置为当前执行文件,但是nuitka为了100%和python兼容,没有设置此值,而__file__没有目录信息,所以需要调用操作系统api来获取了,我这里封装了一个简单的函数:
def getModuleFilePath():
#在使用nuitka编译后获取当前运行目录,当前仅工作于windows
import ctypes
try:
GetModuleFileName = ctypes.windll.kernel32.GetModuleFileNameA
except:
return os.path.dirname(os.path.realpath(__file__))
szPath = ctypes.create_string_buffer(b’\x00′*2048)
GetModuleFileName.argtypes = [ctypes.c_int, ctypes.c_char_p, ctypes.c_int]
GetModuleFileName(0, szPath, 2048)
return os.path.dirname(str(szPath.value))
复制代码
5.结论
我也是经过了一段时间的观望和测试才决定使用nuitka的。
评测结果:通过所有测试用例,可执行文件很大(十多兆),内存占用和打包工具打包后的exe基本一样,效率提升一点点,没有源代码泄漏的担心。
从一段时间的实际使用和测试来看,完全可以部署于生产环境。
当然如果你对文件大小比较敏感并且不在意源代码泄漏的话(pyc很容易被反编译),建议使用打包工具代替。
转载自:http://bbs.chinaunix.net/thread-4151005-1-1.html