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