概要
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 件のコメント:
コメントを投稿