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