iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
0
Software Development

用舒服的姿勢開發 Python Project系列 第 5

[用舒服的姿勢開發 Python Project] Day 05 - pip 中存在的問題

什麼是套件管理工具 (Package Manager)

無論是在開發時或是在系統安裝第三方軟體時,你可能會在安裝說明文件上看過 pip installnpm installapt-get installbrew install 等指令,而在你輸入這些指令時,你就正在操作套件管理工具下載並安裝軟體了!套件管理工具(Package Manager)如 pipnpmyarnapt-get等相當常在你日常的操作中出現(你可以在這裡找到各個語言、不同使用情境的套件管理工具),他們的存在最主要是為了讓你更加方便安裝、刪除、升級原有系統或開發語言所缺少的第三方工具。以撰寫科學計算的程式為例,當你發現 Python 沒有算特徵值、特徵向量的模組而又不想要自己造輪子時,你可能會在 PyPI 這個 Python 官方第三方軟體倉儲找到 NumPy 是完全符合你的需求的,並且依照指示在終端機輸入 pip install numpy 指令後,你就可以在你的程式中呼叫 NumPy 這個套件所提供的所有函式、類別,而也許隨著時間久了,NumPy 發佈了更新的版本,你可以透過 pip install numpy --upgrade 升級並使用最新的 API,或者有天你發現更好的工具想要刪除 NumPy,你可以用 pip uninstall numpy 刪掉它。然而 像 pip 這樣的 Python 內建套件管理工具的看似方便管理許多第三方套件,但隨著產品開發的複雜度增加,卻也慢慢出現了一些開發上不方便之處。

pip 的一些問題

pip 看似方便,可以用來下載第三方套件,然而卻也有著下列的問題:

  • 基於先前提到過在環境之中有著多個版本 Python 的問題,隨著不同的 Python 版本也會有不同版本的 pip,那麼當在輸入指令 pip 時,難以得知自己使用的 pip 是哪一個版本的,必須自行查看 PATH 的優先度,並且確認該路徑下的 Python 是哪個版本。
  • pip 安裝的第三方套件皆為全域,也就是說,當今天有多個專案要同時進行開發,但專案之間有用著相同套件但有著不同的版本,由於 pip 只能夠安裝一個版本,將會導致有一個專案可能不能夠運作。
  • pip 通常會使用 Requirements File 將已經安裝的版本以特定格式紀錄(如下面範例,參閱 PEP 440),然而這樣的紀錄方式,卻讓人難以發現套件彼此的相依性為何,常常發生安裝了一個套件,pip freeze 之後卻跳出了一堆相依且不知道哪裡來的套件,而要解除安裝時,卻無法將所有相依的套件也一並刪除掉。
appdirs==1.4.4
argcomplete==1.12.0
attrs==19.3.0
black==19.10b0
click==7.1.2
pathspec==0.8.0
pipx==0.15.4.0
regex==2020.7.14
toml==0.10.1
typed-ast==1.4.1
userpath==1.4.1
  • Requirements File 的內容若規則未定義清楚,也容易產生相依性衝突,舉例來說當要安裝 requests 時,並不會知道安裝的版本為哪一版(通常是 PyPI 上最新的版本),也因此當專案要協作時,需透過 Requirements File 中寫清楚每個使用的套件版號,用來統一好大家應該要使用哪個版本來進行安裝,但相對 JS 中的 package.json 並沒有明確地將 dev 與 prod 時使用的相依套件區隔出來,並且也缺少了 Lock File 明確指出要的版本。

接下來幾天將會介紹如何避免上述的問題,並且透過哪些工具將可以更方便進行 Python 套件管理。

團隊成員系列文

前端工程師一起來種一棵後端技能樹吧!

想盡辦法當好一個Junior Backend Developer


上一篇
[用舒服的姿勢開發 Python Project] Day 04 - Pyenv 的其他使用方法及原理
下一篇
[用舒服的姿勢開發 Python Project] Day 06 - pip 的注意事項與現況
系列文
用舒服的姿勢開發 Python Project7

尚未有邦友留言

立即登入留言