前言:
隨著開發的程式碼越來越多行,模組與套件的開發思維也要導入,這次我們要試試看,用最簡單的方式來讓自己寫好的一堆Function 變成一個套件。讓還在開發的程式可以被當作一組一組的零件。打個比方,就像是開發一台遙控車,會有車台模組、遙控模組、傳動模組等等,再把它組裝起來,變成一個產品。而本文要分享的僅僅把做好的很多個function放在一個檔案裡面,直接把它當作一個套件打包起來,讓它可以被其他程式檔 import使用。
當然這樣的敘述是有問題的,這裡忽略了類別Class與模組Module的階層概念。因為還在學習;主要的目的是一種最小規模的測試,然後把遇到的問題跟大家分享。
程式架構:
完整的Python 開發應該包含了:
A. Function
功能函式,簡單說就是一個功能。
B. Class
相近功能的組合。
C. Module
很多功能組合成一個.py檔案
D. Package
很多.py的檔案;也就是很多模組打成一包,稱為Package。
上面的敘述是為了讓自己更容易理解,因此用一句話簡而代之,事實上,不只是這樣。想了解的人可以自己深入爬文。若有偏誤,也希望大家一起提出討論。
為了更好的結構,重用性Reusable與可讀性Readable,我們開發的時候應該遵照上面的邏輯去撰寫程式碼。
實際練習:
如上述所說,這邊的練習,只會把一個寫了數個function的 .py檔案放到資料夾,包成Package,在開始試著讓自己寫的其他.py檔案,import 進來使用看看。
在開始之前,下面這張圖是必須了解的。
我們開一個資料夾,把.py的程式檔案放入。然後在資料夾裡面放入一個空檔案,名叫做 __init__.py 也就是讓python知道這是一個套件。
遇到問題:
這邊資料夾我取名為 KeywordPIC 、而程式檔案也叫做 KeywordPIC.py
試著用另一個.py的檔案,在一開頭就寫 import KeywordPIC 想試試看能不能直接變成別個程式可以直接import的套件。結果…
很幸運的馬上遇到報錯!!
AttributeError: module ‘KeywordPIC’ has no attribute ‘GetPICLink’
因此我試著把.py檔案名稱改一下,變成keywordgetpic.py
from KeywordPIC import keywordgetpic
竟然就成功了!? 就可以開始直接用 keywordgetpic.Function(),真棒!!
但難道是不能跟資料夾名稱一樣嗎?
為了證明大小寫是有差異的,不能亂改會讀不到??
我在一開始引用了
from KeywordPIC import KeywordGetPIC
結果就報錯了….
想也是,畢竟沒有檔案叫做 KeywordGetPic.py ,裡面只有小寫的 keywordgetpic.py 。
那不然把keywordgetpic.py 改成含有大小寫的 KeywordGetPic.py,這樣竟然也報錯了。 不是已經把 檔名 跟 程式呼叫引入的名字 弄成一樣了嗎?
後來才發現
原來一旦你執行過python的程式後,在套件的資料夾裡面,會出現一個資料夾叫做 __pycache__
裡面會自動產生一些 .pyc檔案,也就是編譯過的檔案。
若裡面沒有生成 相對應的 .pyc檔案,是不可能成功import自己做的套件。無論你按多少次都會報錯。
後來 我把原來的檔案再改回 KeywordPIC.py 也就是一開始報錯的那一種,但因為
__pycache__ 裡面生成了 對應的.pyc檔案,因此我直接
from KeywordPIC import KeywordPIC
都是大寫也都能用了,卡關了一下,原來是.pyc的問題,但有趣的是第二次改成全小寫竟然順利地自動做出了.pyc檔,因此才能順利引入自製套件包。
查了文獻,其實只要是python3 即便沒有放 init.py的檔案,它也會自動把整個系統路徑中所有的同名的模組收集起來,打成一包。這也是3版以後才有的功能。
關於python3 沒有自動生成 .pyc這邊有人有類似的問題
結論:
打包的時候,套件名稱也就是外層的資料夾名稱,建議不要跟主要的.py檔名一樣。避免混淆;產出.pyc的過程不知道為什麼比較順利。
放在套件資料夾裡面 xxxxx.py 的檔案,必須注意大小寫,要跟未來引入的名稱一致。
不知何故,有時候python並沒有自己產生對應的.pyc檔案,這部分還要持續研究。
經過這次的初探,大概能理解套件打包的方式與邏輯。此次測試的規模還很小,也許方式沒有很正確,但千里之行始於足下。有做就有學,經過這次的練習,我們已經可以分檔案;分模組來開發,最後再整合成一個套件(因為僅僅只有一個檔案,也許也可以說”模組”)。無論如何 , 感覺很不錯,離更好的開發與更好的自己越來越清晰。
也期待大家一起學習一起精進,以上此次學習的過程以及遇到的坑,跟大家分享。
繼續學習
參考: