把一包 Python 程式碼變成一個可以從 Github 下載的 package

Paul Tang
4 min readAug 26, 2020

--

本文主要想要筆記如何建立一個屬於自己的 pip package,然後直接 host 在 Github page 上面,如果有新的版本重新下載就可以直接使用。

本文內容相對其他專業文章來說比較簡單(因為我比較懶惰Q_Q),所以希望拋磚引玉,可以讓大家有些簡單的想法,然後有興趣可以找比較深入的文章來參考。

這對於有一些比較沒自信的玩家(例如小弟我XD),如果心臟不夠大顆不想把你的作品 lib 推上 PyPi,也可以學 Golang 一樣輕鬆使用自己的 public Github repo 作為 host 管理你的函式庫。

使用的範例程式碼在此,可以直接試玩看看

pip install git+https://github.com/cftang0827/pip_package_example@master

而專案內容物如下:

.
├── LICENSE
├── README.md
├── pip_package_example
│ ├── __init__.py
│ ├── api.py
│ └── data
│ ├── __init__.py
│ └── model.json
└── setup.py

其中比較值得注意的部分是 setup.py

本文會針對裡面的一些設定進行簡單的講解,如果需要比較詳盡的也可以參考官方文件

基本上所有相關的設定都會寫在 setup.py 裡面,而在本範例中 pip_package_example 資料夾裡面就是存放你的 package 需要用到的程式碼或是靜態檔案(例如機器學習的 model file 或是一些 config file),因為在 pip package 的邏輯中,不是 .py 結尾的檔案都不被認為是必須的 package file ,所以必須在 setup.py 裡面另外設定。

以上面的作為範例來解釋每一項的用意,詳細的可以看這裏

  • name: 就是 package 的名稱
  • version: package 的版本號碼
  • description: package 的描述文字
  • author: 作者
  • author_email: 作者 email
  • url: package 的官方網站位置,可以使用 Github repo url
  • install_requires: requirement package 的 list,本文只有 numpy,可以使用 >= , <= , == 來表達你想要的版本
  • packages: 通常是一個 List, 通常會放 package 的名稱
  • package_data: 一般來說,setuptools 只會針對 .py 結尾的檔案把他打包,如果今天你想要其他檔案類型(例如 json )那就要把他放在package_data 裡面,其中 pip_package_example 代表package name 後面的 data/*json 代表的就是我們要打包所有在 pip_package_example 裡面有符合 data/*json 的檔案
  • package_dir: 一個 dict 可以 map package 和 資料夾名稱
  • license: string, 代表你在這個 package 用了什麼 License
  • zip_safe: Ture/False, 代表是否可以安全的使用 zip file 安裝這個 package,如果為 False, 代表 bdist_egg 安裝的 command 在 build egg file 的時候會每一次檢查你是否有任何潛在風險,如果設定為 True 可以加快 import 的速度,詳情請閱
  • keywords: For descriptive meta-data,詳情請閱,此關鍵字對於在 PyPI 搜尋該 package 會有幫助
  • classifiers: 包含了這個 package 的類型,支援的平台以及成熟度的資訊,也是一段通常作用在 PyPI 的 meta-data

這次就簡單介紹到這,有問題或是錯誤歡迎留言指證!

參考資料

--

--

Paul Tang
Paul Tang

Written by Paul Tang

初來乍到,剛到東京的菜鳥後端工程師,希望有一天能成為獨當一面的Full Stack Hacker

No responses yet