最短でわかるPyPIによる自作パッケージ公開手順
はじめに
- いくつかの自分のプロジェクトで同じプログラムを使い回す必要が出てきました。
- PyPIに自作パッケージを公開することで、pip installで簡単にインストールし、様々なプロジェクトで使えるようにしました。
- しかし、PyPIへの公開手順が複雑で苦戦したため、忘れないように手順を整理しました。
この記事を読んでほしい人
- 初めてPyPIに自作パッケージを公開する人
- 自作のPythonパッケージをいくつかの他のプロジェクトで使いまわしたい人
やったこと
実際に、自作パッケージaugllmをPyPIに登録し、pip installでインストールして使えるようにしました。
augllmとは
augllm (Augumented LLM)は、ローカル大規模言語モデル (LLM)を使うためのラッパーです。Function Callingにより、データベース検索、web検索、数値計算結果などのツールを実装すれば、その結果追加したクエリを元にLLMによって回答を生成させるためのパッケージです。ollamaをベースに作成しており、画像入力へのマルチモーダルも対応しています。
PyPIへの登録手順
自作パッケージaugllmを例に説明します。
-
githubにPublicリポジトリとして自作パッケージを作成
ディレクトリの構成は以下のようにしておく必要があります。
ルートディレクトリ ├─ LICENSE ├─ README.md ├─ setup.py ... PyPI公開時の設定ファイル(重要) └─ your_liblary/ ... パッケージの実装部分 ├─ __init__.py ... パス管理用.pyファイル ├─ hoge1.py ... パッケージに必要なプログラム群 ├─ hoge2.py ... パッケージに必要なプログラム群 : ... 必要なファイルを配置
-
init.pyの作成
公開したパッケージを他のプログラムで使うためにimportする必要があります。import時に煩雑にならないようにするための設定を行います。
augllmでは、以下のようにしました。これにより、他で使う場合はfrom augllm import AugmentedLLMのように登録したクラスや関数を使えます。
from .augmented_llm import AugmentedLLM from .llm_interface import LLMInterface from .prompt_builder import PromptBuilder __all__ = [ "AugmentedLLM", "LLMInterface", "PromptBuilder", ]
-
setup.pyの作成
setup.pyはPyPIに公開する際に必要なファイルです。パッケージ名や作成者、依存パッケージなどパッケージの情報を記載します。
まず、setuptoolsをインストールしておきます。
pip install -U setuptools
次にsetup.pyを作ります。augllmでは、以下のようにしました。問題なく使えています。long_descriptionを追加するとその内容がPyPIで登録した際にパッケージの情報として表示されます。今回は、githubのリポジトリのREADMEをそのまま表示するようにしました。最初はそのまま真似をすれば良いと思います。
setup.py
from setuptools import setup, find_packages from pathlib import Path this_directory = Path(__file__).parent NAME = 'augllm' AUTHOR = 'Creator name' DESCRIPTION = "A library for augmenting large language models", LONG_DESCRIPTION = (this_directory / "README.en.md").read_text(encoding="utf-8") URL = 'https://github.com/ToPo-ToPo-ToPo/augllm' LICENSE = 'Apache License Version 2.0' VERSION = '1.01' PYTHON_REQUIRES = ">=3.11" CLASSIFIERS = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: Apache Software License", ] # 自作パッケージに必要な他のパッケージ INSTALL_REQUIRES = [ "pyyaml", "ollama", "PyMuPDF", "Pillow", "tqdm", "pytest", ] setup( name=NAME, author=AUTHOR, version=VERSION, description=DESCRIPTION, long_description=LONG_DESCRIPTION, long_description_content_type="text/markdown", url=URL, license=LICENSE, python_requires=PYTHON_REQUIRES, install_requires=INSTALL_REQUIRES, classifiers=CLASSIFIERS, packages=find_packages(), )
-
パッケージのビルド
まず、setup.pyが配置されているルートディレクトリ直下で以下を実行し、配布物のビルドを行います。成功するとdistフォルダとパッケージ名.egg-infoができます。
python setup.py sdist
次に、Wheelパッケージをビルドします。wheelパッケージを以下でインストールしておきます。
pip install -U wheel
次を実行します。成功するとbuildファイルが生成します。
python setup.py bdist_wheel
-
PyPIのユーザー登録
パッケージを登録する前のPyPIのアカウントを作っておきます。
PyPIには本番用とテスト用の2つがあります。違いは以下の通りで、2つのアカウントを作り、テスト用でうまく公開できることを確認してから本番を実行した方が良いです。
- 本番用は全く同じバージョンは1度しか登録できないです。一方、テスト用は何回も登録でき、失敗してもやり直しができます。
- 本番用は、失敗するたびにパッケージのバージョンを更新する必要があります。
アカウント作成では、2段階認証の有効化とAPIトークンの追加が必要になります。アカウント作成ページに沿って対応してください。
-
PyPIへのパッケージ登録準備
Twineというパッケージを使うため、以下でインストールします。
pip install -U twine
TwineによるPyPIアップロード時の設定ファイルである.pypircを作成します。フォーマットは次の通りです。
[distutils] index-servers = pypi testpypi [pypi] repository: https://upload.pypi.org/legacy/ username: __token__ password: アカウントに追加したAPIトークン [testpypi] repository: https://test.pypi.org/legacy/ username: __token__ password: アカウントに追加したAPIトークン
.pypircはhomeディレクトリ直下に保存しておきます。今回は、Apple silicon Macを使っており、以下でファイル作成と編集しました。
vim ~/.pypirc
-
テスト用PyPIへのパッケージアップロード
何回も失敗できるテスト用でアップロード時にエラーが発生しないかを確認します。以下を実行します。
twine upload --repository testpypi dist/*
テスト用PyPIにアップロードしたパッケージのURLが表示されれば、問題ありません。
-
本番用PyPIへのパッケージアップロード
テスト用で問題なくアップロードできることを確認した後、本番用でもアップロードします。以下を実行します。
twine upload --repository pypi dist/*
本番用PyPIにアップロードしたパッケージのURLが表示されれば、問題ありません。これで、パッケージをインストールする際は、以下を実行すれば良いです。
pip install -U your_package
まとめ
- 自作パッケージをPyPIへ登録する手順を整理しました。
- 初めてアップロードした際に経験した失敗内容も記入しました。
- 次回以降、パッケージをPyPIに登録する際の手戻りを減らすことができます。
- 最悪、予期せぬエラーが出た場合は、ChatGPTなどのLLMに投げれば解決します。
Discussion