原本想先提一下這星期用 Python 和 Qt5 寫「浮動工具列」的雛形,但卻寫成『沒有開始功能表的 Windows 生活 (4)』,只好把那部份的故事暫且打住,先專心來介紹 Python 程式心得。
雖然看了一些「Python 模組化」的介紹,也追了幾個程式的模組流程:
小程式
- Civa, lolikit - https://bitbucket.org/civalin/lolikit/src
- eric4 tutorial, MiniBrowser - http://eric-ide.python-projects.org/tutorials/MiniBrowser/
大程式
- mikidown - https://github.com/ShadowKyogre/mikidown
- dupeguru - https://github.com/hsoft/dupeguru
但自己實作時,還是有點撞牆,主要的重點在:
.
Python 的命名空間 (Name Space),是以目錄結構來定義,
Python 的命名空間 (Name Space),是以目錄結構來定義。在主程式 bZmenu.py,要使用 src.bZmenu. 來參照到兩層子目錄底下的 mainwindow.py 裡面的 MainWindow class。
from src.bZmenu.mainwindow import MainWindow
而其他的模組則以 src.bZmenu.xxxx. 等來參照 (落落長?), 此時「相對參照」會讓程式變的簡捷。例如: mainwindow.py 參照到同一個目錄的 commander.py
from . import commander as cmd
下一層 plugin 目錄的 pluginloader.py 也是用相對參照
from . plugin import pluginloader
並且記得每個模組底下要有空的 __init__.py
.
.
子模組單元測試的參照方式
對子模組進行單元測試時,通常會加上類似的程式碼,讓子模組可以單獨執行:
if __name__ == "__main__":
app = QApplication(sys.argv)
main = MainWindow(os.path.join(os.getcwd(),"../.."))
main.show()
sys.exit(app.exec_())
這時,會遇到這樣的錯誤訊息:
Parent module '' not loaded, cannot perform relative import |
找到的解法 是:
try:
import commander as cmd
except ImportError:
from . import commander as cmd
讓兩種參照方式可以依情況切換。
.
延伸閱讀
- 160731 - Python 一週心得
- 160724 - Python 入門第一課
- 0910 - 『沒有開始功能表』的 Windows 生活 (3) ---- 打造查找『我最近的文件』的工具
- 0904 - 『沒有開始功能表』的 Windows 生活 (2) ---- 再探 Launchy, FARR
- 0903 - 『沒有開始功能表』的 Windows 生活 (1) ---- 命令列自動完成, 桌面搜尋
.
0 意見:
發表您的回應張貼留言