Nuitka 笔记

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更帅气的一点是:享受编译福利的同时,你不须要和动态行为说再见。html

2. 安装

首先到官网上根据你的python版本下载对应的nuitka安装包,直接执行安装便可,若是安装完成后系统环境变量中没有nuitka安装目录,建议添加。其次要实现编译,得须要一个编译环境,在windows环境下能够安装微软的VS套件(至少是VS2012,VC6是编译不过的),或者按照MinGW(推荐,小巧,编译速度比VS快)。
安装完编译环境后,要将其bin目录添加到系统的环境变量,以便nuitka调用。python

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要大很多,不过如今的计算机不用在意这一点大小了吧。windows

4.nuitka的一些问题

尽管nuitka已经很稳定了,可是软件都是有bug的,我这里就列出几个我遇到的api

1.python3+pyqt没法脱离python使用
此问题是nuitka不够智能,没有将pyqt全部的依赖都拷贝到目标文件夹所致,因此你要手工拷贝以下文件或目录:
sip.pyd,libEGL.dll,plugins\imageformats\,plugins\platforms\app

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很容易被反编译),建议使用打包工具代替。ui

转载自:http://bbs.chinaunix.net/thread-4151005-1-1.htmlspa

相关文章
相关标签/搜索