這裡一篇文章主要紀錄一下如何發佈 Python package.
事前準備
首先,我們需要先註冊 PyPI 帳號,這樣才能發佈自己的 package.
設定
檔案結構範例
假設此專案底下有兩個 package (pkgA
, pkgB
),每個 package 目錄底下必須有一個 __init__.py
的檔案,package 底下又分別有一些模組,檔案結構範例如下:
1 | MyProject/ |
流程
確認每個 package 目錄底下必須有一個
__init__.py
的檔案。如果沒有
script
,則不需要bin/
資料夾。建立
CHANGELOG.md
,記錄更新內容。建立
LICENSE.txt
,內容為開源協議。建立
README.md
,介紹並說明 package 如何使用。將文件檔放在
docs/
.建立
MANIFEST.in
,設定 PyPI 要包含哪些檔案,預設不包含.txt
,MANIFEST.in
範例:1
2
3# MANIFEST.in
# 包含docs底下的所有檔案
graft docsMANIFEST.in
常用指令:
建立
setup.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19from setuptools import setup
import codecs
setup(
name='package name',
version = '1.0.0',
description = 'Description for this package.',
long_description = codecs.open('docs/README.md', 'r', 'utf-8').read(),
long_description_content_type='text/markdown',
author = 'author',
author_email = 'your_email',
url = 'url for this package',
packages = ['pkgA', 'pkgB'],
keywords = ['keyword for this package'],
license = 'docs/LICENSE.txt',
install_requires=[
'requests >= 2.13.0'
]
)- name: package 的名稱
- version: 版本
- author: 作者
- author_email: 作者 email
- packages: 此 package 包含的所有 package,以範例來說就是
pkgA
,pkgB
- script: 可執行的
script
,如果沒有可省略 - url: package 連結,可連結到 GitHub
- license: 開源協議
- description: package 簡單的描述
- long_description: 詳細的描述,上述範例是讀取
docs/README.md
- long_description_content_type: 設定 long_description content type, 這裡我們設定為 markdown 格式
- install_requires: 依賴的項目
發佈
依照上面步驟設定好 package 之後,需要再安裝以下套件才能發佈 package:
1 | $ pip3 install setuptools wheel twine |
新版已經不需要先註冊 package, 如果執行註冊指令會看到以下訊息: Registering is deprecated, use twine to upload instead
. 所以直接產生 package,並使用 twine
上傳 package 即可。
產生 package:
1 | $ python setup.py sdist bdist_wheel |
上傳 package:
1 | $ twine upload dist/* |
這樣就成功發佈自己的 package 囉!
之後我們就可以方便地安裝和使用 package:
1 | $ pip3 install <package_name> |