從寫Package到打包上傳PYPI
從 setup.py 與 pyproject.toml 的最小結構開始,用 setuptools 打包,先上 TestPyPI 驗證再正式發布到 PyPI 的完整流程。
Prerequisites
為了讓後面流程順暢,我們先把需要的套件先安裝好,並且在PYPI以及TestPYPI申請帳號,等等上傳 package 到兩個網站上面
pip install twine
pip install --upgrade setuptools
pip install build如何寫一個 Package
Python 有一定的 package 格式,我們舉簡單的例子 在你的 package 底下,會先有 README.md 以及 setup.py,README.md 是 MarkDown 格式寫下的文件,是 GitHub 上常見的手冊 setup.py 我們在底下給一個範本,等下會使用 setuptools 夠過這個 setup.py 產出 package 封包,以便發布至 PYPI。我們也需要一個 pyproject.toml 來告訴 setuptools 我們要用 setuptools 來建構這個 package。
在 main 裡,放著就是主要 package 的內容,我這邊只有一個 scripts.py 來作為範例,而裡面的__init__.py 會讓資料夾被 python 讀成是一個 package,所以一定要產生一個__init__.py 放在裡面,內容可以為空就好。
My project
|_____setup.py
|_____pyproject.toml
|_____README.md
|_____main
|_____scripts.py
|_____ __init__.pyfrom setuptools import setup
setup(name='mypackage',
version='0.1',
description='This is my first package',
url='#', # your GitHub page or any description page can be included here
author='Tyler',
author_email='author@email.com',
license='MIT',
packages=['main']) 在此刻你已經可以使用python setup.py install來做 local 全域安裝,也就是在 python 裡,你可以隨時做 import,就如同 import numpy as np 一樣。
接下來就是要把你的程式寫成封包上傳,python -m build
就會產生相對應的封包 e.g., .whl, .gz, .tar,到這一步就準備要上傳啦~
把封包上傳至 TestPYPI
python -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
或者上傳至 PYPI
python -m twine upload dist/*
實戰演練
實作一個摩斯密碼翻譯的 package,在 main 底下,有__init__.py 以及 MorseDecode.py,也是主要功能的來源
那我們在 setup.py 裡面設定如下,然後__init__.py 保持空白
from setuptools import setup
import setuptools
with open("README.md", "r") as rm: # 使用GitHub的README檔案來當作PYPI上的Description
long_description = rm.read()
setup(name='Morse Translator', # 你的package名稱
version='0.1', # 版本序號
description='Trivial Package Testing', #簡單敘述
url='https://github.com/Tylerastro/MorseCode',
long_description=long_description, # 敘述本文,我使用上方導入的MD file
long_description_content_type="text/markdown", # 告訴setup使用的是MarkDown語法
entry_points = { # 讓package可以直接call main的階段 --> 見reference
"console_scripts": [ # 我希望我可以直接在terminal call morse而不是python morse.py
"morse = main.MorseDecode:main",
]
},
author='Tylerastro', # 作者資訊
python_requires='>=3', # Python版本
classifiers=[ # PYPI上的分類,可以見https://pypi.org/classifiers/
'Development Status :: 2 - Pre-Alpha'
],
license='MIT',
packages= setuptools.find_packages())我們在 terminal 輸入python -m build
在路徑下會產生對應的 dist 跟 egg 資料夾
之後我們在 terminal 輸入python -m twine upload dist/*上傳至 PYPI 上面,同時也會要求我們輸入使用者名稱與密碼。隨後就會看到上傳完成的訊息。
我們就可以在 PYPI 上看到我們的專案囉!
我們可以試著嘗試安裝回來使用看看,在 terminal 輸入pip install Morse-Translator==0.1
的確!我們安裝成功了,程式也可以運作。 如果往後要更新,記得把原本的 dist 以及 egg 資料夾刪除,並且更新 setup.py 裡面的版本,再重新做 build 以及上傳,因為 PYPI 不允許覆蓋更新。
Reference:
https://medium.com/資工筆記/打包 python-module-到 pypi-上-aef1f73e1774 https://setuptools.readthedocs.io/en/latest/userguide/quickstart.html https://www.freecodecamp.org/news/build-your-first-python-package/ https://www.tutorialsteacher.com/python/main-in-python https://stackoverflow.com/questions/27784271/how-can-i-use-setuptools-to-generate-a-console-scripts-entry-point-which-calls