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 中包含四個項目:
-
scripts
:當作主程式啟動的腳本(就是指令中 input 的檔案,只有一個)。 -
pure
:所需的 Python 模組(通常會直接參照 import 的項目搜尋到,所以不用填)。 -
binaries
:所需的非 Python 模組。 -
datas
:其他所需的非二進制文件(如圖片或是音訊檔)。
不過在 binaries
清單中的示範是填入函式庫中的連結名稱,不知道如果是 DLL 或 SO 的話要如何辨識名稱;直接寫上 _slvs.pyd
或是 libslvs.so
的位址也不能解決問題。
Ubuntu 編譯成功
在一台 16.04 的實體機中,使用 PyInstaller 直接用預設設定編譯,能成功編譯出 Pyslvs 的 Linux 版可執行檔。
Linux 平台的 SO 函式庫似乎不用特別指定也能找到 _slvs.so
和 libslvs.so
的內容;Windows 的 DLL 就得看當初連結庫的名稱是什麼了。
Comments
comments powered by Disqus