Pyslvs 開發進度:
- 偵錯輸出
- 編譯自動偵測版本
Pyslvs 開發進度
偵錯輸出
由於編譯成執行檔後遇到錯誤會直接閃退,沒辦法在背後的 command line 留下錯誤紀錄,因此使用 Python 的 logging 模組功能,紀錄錯誤的訊息到 PyslvsLogFile.log
中,與執行檔同目錄。
程式碼如下:
if e!=SystemExit: import logging logging.basicConfig(filename='PyslvsLogFile.log', filemode='w', format='%(asctime)s | %(message)s', level=logging.INFO) logging.exception("Exception Happened.") print('{}\n{}'.format(type(e), e)) exit(1)
舊有的紀錄檔會被複寫。
編譯自動偵測版本
使用 Makefile 的 shell 指令呼叫作業系統的 Python3,並回傳版本和平台資訊。
要暫時在 target 中設定變數,可以使用 eval 指令達成。
使用 Eric 寫 code 時是使用 kernel_getter.py
的 if 語句匯入 kernel,不過會造成 PyInstaller 包裝掩蓋函式庫名稱的問題。此問題只發生在 Ubuntu,最近才發現 PyInstaller 匯入任何「可能性」函式庫時會發生撞名問題,之前 Python 3.4 就是因為加入 3.5 的 kernel 後才發生無法編譯的情形。
針對此方法採用 Makefile 自動修改檔名的方式解決。
編譯時先將 py35.py 等檔案挑出相符的版本,改成 kernel_getter.py
後就會單獨 import 對應版本的 kernel。
以下是自動套用 Python 版號後的編譯流程。
project_site 已新增 Makefile script 的 brush,來源:
https://p--q.blogspot.tw/2015/05/linuxbean140423makefilesyntaxhighlighte.html
build: launch_pyslvs.py @echo ---Pyslvs Build--- @echo ---$(OS) Version--- ifeq ($(OS),Windows_NT) $(eval PYTHON = py$(shell python -c "import sys, platform;t='{v[0]}{v[1]}'.format(v=list(sys.version_info[:2]))+('w' if platform.system().lower()=='windows' else '');sys.stdout.write(t)")) @echo --Python Version $(PYTHON)-- rename .\core\kernel\kernel_getter.py _kernel_getter.py rename .\core\kernel\$(PYTHON).py kernel_getter.py pyinstaller $< -i ./icons/main_big.ico python setup.py build @echo ---Copying Folder and Files--- $(eval PYTHOND = $(shell python -c "import sys, platform;t='{v[0]}.{v[1]}'.format(v=list(sys.version_info[:2]));sys.stdout.write(t)")) xcopy .\build\exe.win-amd64-$(PYTHOND)\core\kernel\$(PYTHON) .\dist\launch_pyslvs\core\kernel\$(PYTHON) /s /y /i xcopy .\build\exe.win-amd64-$(PYTHOND)\core\kernel\pyslvs_generate\$(PYTHON) .\dist\launch_pyslvs\core\kernel\pyslvs_generate\$(PYTHON) /s /y /i rename .\dist\launch_pyslvs Pyslvs rename .\core\kernel\kernel_getter.py $(PYTHON).py rename .\core\kernel\_kernel_getter.py kernel_getter.py else $(eval PYTHON = py$(shell python3 -c "import sys, platform;t='{v[0]}{v[1]}'.format(v=list(sys.version_info[:2]))+('w' if platform.system().lower()=='windows' else '');sys.stdout.write(t)")) @echo --Python Version $(PYTHON)-- mv core/kernel/kernel_getter.py core/kernel/_kernel_getter.py mv core/kernel/$(PYTHON).py core/kernel/kernel_getter.py pyinstaller $< mv dist/launch_pyslvs dist/Pyslvs mv core/kernel/kernel_getter.py core/kernel/$(PYTHON).py mv core/kernel/_kernel_getter.py core/kernel/kernel_getter.py endif @echo ---Done---
上面的 Makefile 已成功在雙平台測試無誤。
而效果也能應用到製作 Debian Package 的版號對應。
DEBIANCONTROL = dist/temp/DEBIAN/control deb: build dist/Pyslvs ifeq ($(OS),Windows_NT) @echo ---Ubuntu only--- else mkdir dist/temp dist/temp/DEBIAN dist/temp/usr/ dist/temp/usr/bin dist/temp/usr/share/ touch $(DEBIANCONTROL) echo 'Package: pyslvs' >> $(DEBIANCONTROL) $(eval PYSLVS = "Version: $(shell python3 -c "import sys;from core.info.info import VERSION;sys.stdout.write(VERSION[0])")") echo $(PYSLVS) >> $(DEBIANCONTROL) echo 'Architecture: all' >> $(DEBIANCONTROL) echo 'Description: Dimensional Synthesis of Planar Four-bar Linkages in PyQt5 GUI.' >> $(DEBIANCONTROL) echo 'Maintainer: Yuan Chang daan0014119@gmail.com' >> $(DEBIANCONTROL) mv dist/Pyslvs dist/temp/usr/share/ ln -s /usr/share/Pyslvs/launch_pyslvs dist/temp/usr/bin/pyslvs mv dist/temp dist/Pyslvs dpkg -b dist/Pyslvs endif
Comments
comments powered by Disqus