網路上大家分享的 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 」 檢視。
純 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 什麼的算是非常小了。
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());
既然都玩到這個份上來,再隨手拖個介面吧: