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