Python 初探如何打包自己做的Package

python_package_study_feature_pic

前言:

隨著開發的程式碼越來越多行,模組與套件的開發思維也要導入,這次我們要試試看,用最簡單的方式來讓自己寫好的一堆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檔案,這部分還要持續研究。

經過這次的初探,大概能理解套件打包的方式與邏輯。此次測試的規模還很小,也許方式沒有很正確,但千里之行始於足下。有做就有學,經過這次的練習,我們已經可以分檔案;分模組來開發,最後再整合成一個套件(因為僅僅只有一個檔案,也許也可以說”模組”)。無論如何 , 感覺很不錯,離更好的開發與更好的自己越來越清晰。

也期待大家一起學習一起精進,以上此次學習的過程以及遇到的坑,跟大家分享。

繼續學習

參考:

https://www.tutorialsteacher.com/python/python-package

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *