aardio + Python 可視化快速開發桌面程式,一鍵生成獨立 EXE
網路上大家分享的 aardio + Python 混合開發的文章很多,不得不說 aardio 與 Python 混合開發是真的簡單 !
▶ 快速入門
推薦幾個快速上手教程:
《 aardio + Python 開發桌面軟體快速入門 》
《 aardio 快速入門 – 語法速覽 》
在 aardio 中可直接創建 Python 工程:
aardio 可視化開發圖形介面非常方便,相關的教程、開源項目都很多,這裡就不多說了。
至於 aardio + Python 互調也非常簡單,示例:
import console; import py3; //導入 Python 模組。 var itertools = py3.import("itertools") //調用 Python 函數,支援純 aardio 類型參數 var permutations = itertools.permutations({"a","b","c"}); //調用 Python 內置函數 list var pyList = py3.list(permutations); //遍歷 Python 對象成員 for( item in pyList.each() ){ console.log(item); //像 aardio 對象一樣使用 Python 對象 } console.pause();
aardio 自帶的 Python 範例也非常多,請打開「 aardio 範例 > 調用其他語言 > Python 」 查看。
▶ 一鍵成獨立 EXE 文件
純 aardio 程式可以方便地生成獨立 EXE 文件,不需要虛擬化,不需要釋放臨時文件 —— 這是因為 aardio 自帶的文件函數都自動兼容了 EXE 內嵌資源路徑。 即使用到了一些第三方的 DLL 組件一般也可以自記憶體載入,即使是 .NET 程式集也可以方便地自記憶體載入。
但是 Python 不能這樣搞,aardio + Python 生成的軟體就必須帶上 Python 解釋器,*.py 文件一般也是放在硬碟上。
下面是我用 aardio + Python 範例工程生成 EXE 得到的文件:
上面的 PyApp.exe 需要帶上 /lib/ , /py/ 這幾個目錄才能運行。當然,這裡面已經自帶了綠色的 Python 運行時,用戶電腦不再需要安裝 Python 。
但是很多用戶喜歡小輕快的獨立 EXE 文件。我經常被問到這個問題,怎樣將 aardio + Python 開發的軟體轉換為獨立 EXE。
其實用免費的虛擬化封包工具( 不需要額外釋放臨時文件 ) Enigma Virtual Box 就可以將上面的幾個文件轉換為獨立 EXE 文件。我基於 Enigma Virtual Box 寫了一個擴展庫 process.vb ,可以一鍵完成所有操作。
新版 aardio 生成 EXE 後多了一個「轉換為獨立 EXE」按鈕。
點擊「轉換為獨立 EXE」以後生成了新的 PyApp.exe 。然後我們可以刪掉其他的 /lib/, /py/ 目錄,因為 PyApp.exe 不再需要這些目錄了(已經封包到 PyApp.exe 內部了)。
包含了 Python 運行時的 PyApp.exe 體積為 19MB,打個壓縮包其實只有 7 MB,這個體積相比 Electron 什麼的算是非常小了。
▶ process.vb 擴展庫
Enigma Virtual Box 的主程式並沒有提供編程介面,也不支援命令行參數。但提供了一個命令行工具 enigmavbconsole,可以傳入 Enigma Virtual Box 生成的工程文件(*.evb)路徑並生成獨立 EXE 文件。
而 evb 工程文件實際上是一個 XML 文件。
Enigma Virtual Box 介面上如果拖入包含中文的路徑,生成的 evb 會出現亂碼。但實際上 evb 支援 Unicode / UTF-8 編碼,如果我們用程式生成 evb 文件,並存為 UTF-8 編碼,enigmavbconsole 是可以正常處理的。 但如果在 Enigma Virtual Box 介面上再次打開這個 evb 文件,介面上又亂碼了。
這個 evb 的內容其實也有些複雜,但好在 aardio 寫程式速度快,要不了幾句程式碼這個 process.evb 擴展庫就寫好了。
來個簡單的調用例子:
import console; import process.evb.project; import ide; //創建封包工程 var evbProject = process.evb.project() //設置啟動 EXE evbProject.main = ide.getPublishPath(); //設置要生成的獨立 EXE evbProject.output = io.tmpname(,".dat"); //添加發布目錄下的所有文件 evbProject.addSubFile(ide.getPublisDir()); //生成工程 evbProject.generate("/app.evb"); //生成獨立 EXE import process.evb; var evb = process.evb("/app.evb") evb.logResponse(); //清理臨時文件 io.remove("/app.evb"); fsys.move(evbProject.output,ide.getPublishPath());
既然都玩到這個份上來,再隨手拖個介面吧: