0%

[Python] 發佈 Python package

Python package

這裡一篇文章主要紀錄一下如何發佈 Python package.

事前準備

首先,我們需要先註冊 PyPI 帳號,這樣才能發佈自己的 package.

設定

檔案結構範例

假設此專案底下有兩個 package (pkgA, pkgB),每個 package 目錄底下必須有一個 __init__.py 的檔案,package 底下又分別有一些模組,檔案結構範例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MyProject/
├─ docs/
│ ├─ README.md
│ ├─ LICENSE.txt
│ └─ CHANGELOG.md
├─ pkgA/
│ ├─ __init__.py
│ ├─ modA_1.py
│ └─ modA_2.py
├─ pkgB/
│ ├─ __init__.py
│ └─ modB.py
├─ MANIFEST.in
└─ setup.py

流程

  1. 確認每個 package 目錄底下必須有一個 __init__.py 的檔案。

  2. 如果沒有 script,則不需要 bin/ 資料夾。

  3. 建立 CHANGELOG.md,記錄更新內容。

  4. 建立 LICENSE.txt,內容為開源協議。

  5. 建立 README.md,介紹並說明 package 如何使用。

  6. 將文件檔放在 docs/.

  7. 建立 MANIFEST.in,設定 PyPI 要包含哪些檔案,預設不包含.txt, MANIFEST.in 範例:

    1
    2
    3
    # MANIFEST.in
    # 包含docs底下的所有檔案
    graft docs

    MANIFEST.in 常用指令:
    MANIFEST.in 指令

  8. 建立 setup.py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    from 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>

參考資料