2021年5月7日金曜日

独自の Pypi パッケージを作成する方法

独自の Pypi パッケージを作成する方法

概要

Python でパッケージ化した場合 Pypi で配布します
今回はパッケージを作成して Pypi で配布する流れを紹介します

環境

  • macOS 11.2.3
  • Python 3.8.7

パッケージの雛形の作成

  • mkdir src
  • mkdir src/echo_test
  • touch src/echo_test/__init__.py
  • touch LICENSE
  • touch pyproject.toml
  • touch README.md
  • touch setup.cfg
  • touch setup.py
  • mkdir tests

pyproject.toml

ビルドするために必要なツールを記載します
今回は必要最低限のツールだけを記載していますが依存するツールやライブラリがある場合はここに追記します

[build-system]
requires = [
    "setuptools>=42",
    "wheel"
]
build-backend = "setuptools.build_meta"

setup.py

配布するパッケージのメタ情報を記載します
同じようなファイルに setup.cfg というファイルがありますがこちらは静的ファイルになります
setup.py であれば Python でメタ情報を定義できるので動的に変更したい場合には setup.py を使います

import setuptools

with open("README.md", "r", encoding="utf-8") as fh:
    long_description = fh.read()

setuptools.setup(
    name="echo-test-hawksnowlog",
    version="0.0.1",
    author="hawksnowlog",
    author_email="hawksnowlog@mail.domain",
    description="A test pypi package",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/hawksnowlog/echo-test",
    project_urls={
        "Bug Tracker": "https://github.com/hawksnowlog/echo-test/issues",
    },
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    package_dir={"": "src"},
    packages=setuptools.find_packages(where="src"),
    python_requires=">=3.6",
)

name の後ろにユーザ名を付与していますが今回はテストなので付与しています
実際に Pypi で公開する場合にはユーザ名の部分を削除して他のパッケージと重複しない名前を設定してください

ソースを公開している Github の URL などは今回適当に設定しています

README.md

パッケージの概要を記載します
setup.py で読み込んでいる内容で Pypi のサイトでも表示される情報になります
インストール方法や簡単な使い方を記載します

# Echo Test

This is a test pypi package. It shows echo messages.

LICENSE

ライセンスの情報を記載します
今回はライセンスはここから MIT ライセンスを選択してコピペしているだけです

Copyright (c) 2018 The Python Packaging Authority

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

ビルド

ここまでできればビルドしてパッケージ化できます
パッケージ化には build ツールが必要になるのでまずはインストールします

  • python3 -m pip install --upgrade build

上記は一度インストールしたら次回以降の実行は不要です
そしてビルドします

  • python3 -m build

ビルドが成功すると dist/ 配下に tar.gz ファイルと whl ファイルが作成されます
これを Pypi にアップロードして公開します

Test Pypi アカウントの作成

今回はパッケージ化の流れを理解するためにテスト用のパッケージを作成しました
Pypi にはそういったテスト用の Pypi があり TestPypi と言います
今回はこの TestPypi を使います
TestPypi は pip コマンドの検索には引っかからず実際にはユーザには公開されない Pypi になります

ユーザやパッケージも一定期間で自動的に削除されるようです
まずはユーザを作成しましょう

https://test.pypi.org/account/register/

<

ここでユーザ名とメールアドレスを登録するとメールが来るので verify しましょう
これで TestPypi が使えるようになります

API トークンを取得する

ビルドした tar.gz と whl ファイルをアップロードするには API トークンが必要になります

Account settings の真ん中くらいに API tokens という項目があるのでここで公開するための API トークンを追加しましょう

<

パッケージをアップロードする

これで TestPypi にパッケージをアップロードできる準備ができました
アップロードするにはビルド時と同様にツールが必要になるので先にインストールします

  • python3 -m pip install --user --upgrade twine

インストールできたら実行して公開します
ユーザ名とパスワードが聞かれた __token__ ユーザを入力しパスワードは先程取得した API トークンを入力しましょう

  • python3 -m twine upload --repository testpypi dist/*

これで TestPypi を確認すると問題なくパッケージがあることが確認できます

動作確認

動作確認してみましょう
pip で先程公開したパッケージをインストールしてみます

  • python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps echo-test-hawksnowlog

あとは python の REPL を使ってパッケージが import できれば OK です

% python3
Python 3.8.7 (default, Dec 30 2020, 10:14:55) 
[Clang 12.0.0 (clang-1200.0.32.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import echo_test

最後に

実際に Pypi で公開する場合には以下の追加の作業と変更が必要になります

  • Pypi でアカウントの作成と API トークンの取得
  • パッケージの name を被らない名前にしユーザ名の部分を削除する

また TestPypi で公開したパッケージは不要であれば削除しておきましょう

おまけ: 公開前にローカルでテストする方法

例えば適当にファイルを追加してそれを先にローカルで動作確認したい場合があると思います
そんな場合には以下のように先にローカルで pip install してから公開しましょう

  • touch src/echo_test/hello.py
  • vim src/echo_test/hello.py
class Message():
    def __init__(self, message="Hello"):
        self.message = message

    def show(self):
        print(self.message)
  • rm -rf dist/ build/
  • python3 -m build
  • python3 -m pip install dist/echo-test-hawksnowlog-0.0.1.tar.gz
% python3       
Python 3.8.7 (default, Dec 30 2020, 10:14:55) 
[Clang 12.0.0 (clang-1200.0.32.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from echo_test.hello import Message
>>> m = Message()
>>> m.show()
Hello

削除する場合は以下の通りです

  • python3 -m pip uninstall echo-test-hawksnowlog

参考サイト

0 件のコメント:

コメントを投稿