PyInstaller 編譯問題

PyInstaller 編譯問題

將目前原始碼轉為執行檔的測試。由於之前只有成功編譯小型的 PyQt5 介面,所以嘗試看看在比較大的架構下,所有分支模組中是否會有導入問題。

Pyslvs 程式碼整理

將程式碼整理了一下,避免發生一些狀況。

移除了讀取 git 資訊的功能,因為這個資訊會讀取 .git 資料夾內的內容。

後來將 PyQt4 的導入去除,實際上也沒有用到 PyQt4 的框架。

Solvespace 函式庫問題

出現了一個重大的問題,在編譯後會找不到函式庫的名稱。

ImportError: No module named 'core.kernel.py35w._slvs'
...
ImportError: DLL load failed: The specified module could not be found.

參閱 PyInstaller 的技術文件後,瞭解到如果使用的 DLL 類函式庫名稱不在程式碼中的話,必須手動加入 Spec 文件中。

https://pyinstaller.readthedocs.io/en/stable/spec-files.html

Spec 文件是 PyInstaller 的執行腳本,若沒有指定的話會自己生產一個預設設定的 Spec 文件。

Spec 文件的 Analysis 中包含四個項目:

  1. scripts:當作主程式啟動的腳本(就是指令中 input 的檔案,只有一個)。

  2. pure:所需的 Python 模組(通常會直接參照 import 的項目搜尋到,所以不用填)。

  3. binaries:所需的非 Python 模組。

  4. datas:其他所需的非二進制文件(如圖片或是音訊檔)。

不過在 binaries 清單中的示範是填入函式庫中的連結名稱,不知道如果是 DLL 或 SO 的話要如何辨識名稱;直接寫上 _slvs.pyd 或是 libslvs.so 的位址也不能解決問題。

Ubuntu 編譯成功

在一台 16.04 的實體機中,使用 PyInstaller 直接用預設設定編譯,能成功編譯出 Pyslvs 的 Linux 版可執行檔。

Linux 平台的 SO 函式庫似乎不用特別指定也能找到 _slvs.solibslvs.so 的內容;Windows 的 DLL 就得看當初連結庫的名稱是什麼了。


Comments

comments powered by Disqus