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());

既然都玩到這個份上來,再隨手拖個介面吧: