Pythonプロジェクトのパッケージング
このチュートリアルでは、簡単なPythonプロジェクトをパッケージ化する方法について案内します。必要なファイルと構造を追加してパッケージを作成し、パッケージをビルドしてPythonパッケージインデックスにアップロードする方法を紹介します。
簡単なプロジェクトのセットアップ
このチュートリアルでは、sample_libという名前の簡単なプロジェクトを使用します。Pythonのモジュールとパッケージのインポートに慣れていない場合は、数分かけてPythonドキュメントのパッケージとモジュールに関する部分を読むことをお勧めします。
ローカルにこのプロジェクトを作成するには、以下のファイル構造を作成してください:
/sample_lib
/sample_lib
__init__.py
この構造を作成した後、このチュートリアルのすべてのコマンドをトップレベルのフォルダで実行する必要があります - そのため、cd sample_libを実行していることを確認してください。
また、sample_lib/__init__.pyを編集し、以下のコードを追加してください:
package_name = "sample_lib"
version = "1.0.0"
これは、後で正しくインストールされているかどうかを検証するためのものです。
パッケージングファイルの作成
次に、このプロジェクトをパッケージ化して配布の準備をするためのいくつかのファイルを作成します。以下にリストされている新しいファイルを作成してください - 内容は後のステップで追加していきます。
/sample_lib
/sample_lib
__init__.py
setup.py
LICENSE
README.md
setup.pyの作成
setup.pyはsetuptoolsのビルドスクリプトです。パッケージの名前やバージョン、含めるコードファイルなどの情報をsetuptoolsに伝えます。
setup.pyを開き、以下の内容を入力してください。必要に応じて値をカスタマイズできます:
import setuptools
with open("README.md", "r", encoding="utf-8") as readme_file:
long_description = readme_file.read()
setuptools.setup(
name="sample_lib",
version="1.0.0",
author="Sample Developer",
author_email="developer@example.com",
description="A sample utility library",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/sample/sample_lib",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires=">=3.6",
)
setup()にはいくつかの引数があります。この例では比較的シンプルなセットを使用しています:
nameはパッケージの名前です。文字、数字、_、-を含むことができます。ただし、PyPIでは使用されていない名前にする必要があります。versionはパッケージのバージョンです。PEP 440を参照してバージョンに関する詳細情報を確認してください。authorとauthor_emailはパッケージの作成者を特定するために使用されます。descriptionはパッケージの短い、一文の要約です。long_descriptionはパッケージの詳細な説明です。これはPythonパッケージインデックスのパッケージ詳細ページに表示されます。ここでは、長い説明をREADME.mdから読み込むのが一般的なパターンです。long_description_content_typeは、長い説明に使用されるマークアップの種類をインデックスに伝えます。ここではMarkdownです。urlはプロジェクトのホームページのURLです。多くのプロジェクトでは、これはGitHub、GitLab、Bitbucketなどのコードホスティングサービスへのリンクです。packagesは、配布パッケージに含めるすべてのPythonインポートパッケージのリストです。各パッケージを手動でリストする代わりに、find_packages()を使用してすべてのパッケージとサブパッケージを自動的に発見できます。この場合、パッケージリストはsample_libになります。これが唯一のパッケージだからです。classifiersはインデックスとpipにパッケージに関する追加のメタデータを伝えます。この例では、パッケージはPython 3と互換性があり、MITライセンスで提供され、OSに依存しません。パッケージが使用するPythonバージョン、利用可能なライセンス、パッケージが使用するOSを常に含める必要があります。分類子の完全なリストについては、https://pypi.org/classifiers/ を参照してください。
ここで言及したもの以外にも多くのオプションがあります。詳細については、「パッケージングとプロジェクトの配布」を参照してください。
README.mdの作成
README.mdを開き、以下の内容を入力してください。必要に応じてカスタマイズできます。
# Sample Library
これは簡単なサンプルライブラリです。コンテンツを作成する際には、
[GitHub風のMarkdown](https://guides.github.com/features/mastering-markdown/)を使用できます。
ライセンスファイルの作成
Pythonパッケージインデックスにアップロードするすべてのパッケージにはライセンスが含まれていることが重要です。これにより、ユーザーはパッケージを使用する際の条件を理解できます。ライセンスの選択については、https://choosealicense.com/ を参照してください。ライセンスを選択したら、LICENSEファイルを開き、ライセンスのテキストを入力してください。例えば、MITライセンスを選択した場合:
Copyright (c) 2023 Sample Developer
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.
配布アーカイブの生成
次に、パッケージ用の配布アーカイブを生成します。これらはパッケージインデックスにアップロードされ、pipでインストールできるアーカイブです。
setuptoolsとwheelの最新バージョンがインストールされていることを確認してください:
python3 -m pip install --user --upgrade setuptools wheel
ヒント
これらのパッケージのインストール中に問題が発生した場合は、「パッケージのインストール」チュートリアルを参照してください
次に、setup.pyがある同じディレクトリで以下のコマンドを実行します:
python3 setup.py sdist bdist_wheel
このコマンドは多くのテキストを出力します。完了すると、distディレクトリに2つのファイルが生成されるはずです:
dist/
sample_lib-1.0.0-py3-none-any.whl
sample_lib-1.0.0.tar.gz
注意
問題が発生した場合は、出力をコピーしてパッケージングに関する質問を投稿してください。可能な限りお手伝いします!
tar.gzファイルはソースアーカイブで、.whlファイルはビルドされた配布ファイルです。新しいpipバージョンはビルドされた配布ファイルを優先してインストールしますが、必要に応じてソースアーカイブにフォールバックします。常にソースアーカイブをアップロードし、プロジェクトが互換性のあるプラットフォーム用にビルドされたアーカイブを提供する必要があります。この例では、サンプルパッケージはすべてのプラットフォームでPythonと互換性があるため、1つのビルドされた配布ファイルで十分です。
配布アーカイブのアップロード
最後に、パッケージをPythonパッケージインデックスにアップロードする時が来ました!
最初に行うべきことは、Test PyPIでアカウントを登録することです。Test PyPIは、テストと実験用のパッケージインデックスの別のインスタンスです。このチュートリアルのように本物のインデックスにアップロードする必要がない場合に便利です。アカウントを登録するには、https://test.pypi.org/account/register/にアクセスし、ページの手順を完了してください。パッケージをアップロードする前に、メールアドレスを確認する必要もあります。Test PyPIの詳細については、「TestPyPIの使用」を参照してください。
アカウント登録が完了したら、twineを使用して配布アーカイブをアップロードできます。Twineをインストールする必要があります:
python3 -m pip install --user --upgrade twine
インストールが完了したら、twineを使用してdistディレクトリ内のすべてのアーカイブをアップロードします:
twine upload --repository-url https://test.pypi.org/legacy/ dist/*
システムは、Test PyPIに登録したユーザー名とパスワードの入力を求めます。コマンドが完了すると、以下のような出力が表示されるはずです:
Uploading distributions to https://test.pypi.org/legacy/
Enter your username: [your username]
Enter your password:
Uploading sample_lib-1.0.0-py3-none-any.whl
100%|█████████████████████| 5.12k/5.12k [00:01<00:00, 3.25kB/s]
Uploading sample_lib-1.0.0.tar.gz
100%|█████████████████████| 4.78k/4.78k [00:01<00:00, 3.18kB/s]
注意
エラーメッセージが表示される場合は、パッケージの一意の名前を選択する必要があります。sample_lib_your_usernameのような名前が良い選択です。setup.pyのnameパラメータを更新し、distフォルダを削除してからアーカイブを再生成してください。
アップロード後、パッケージはTestPyPIで表示できるはずです。例えば、https://test.pypi.org/project/sample-lib
アップロードしたパッケージのインストール
pipを使用してパッケージをインストールし、正しく機能するかどうかを検証できます。新しいvirtualenvを作成してください(詳細は「パッケージのインストール」チュートリアルを参照)し、TestPyPIからパッケージをインストールします:
python3 -m pip install --index-url https://test.pypi.org/simple/ sample_lib
注意
前のステップで異なるパッケージ名を使用した場合は、上記のコマンドでsample_libをあなたのパッケージ名に置き換えてください。
pipはTest PyPIからパッケージをインストールし、出力は次のようになるはずです:
Collecting sample_lib
Downloading https://test-files.pythonhosted.org/packages/.../sample_lib-1.0.0-py3-none-any.whl
Installing collected packages: sample-lib
Successfully installed sample-lib-1.0.0
モジュールをインポートし、以前__init__.pyに配置したpackage_name属性を参照することで、正しくインストールされているかどうかをテストできます。
Pythonインタープリターを実行してください(まだvirtualenv内にあることを確認):
python
次に、モジュールをインポートし、package_name属性を出力します。配布アーカイブに与えた名前に関係なく、これは同じ値になるはずです。なぜなら、インポートパッケージはsample_libだからです。
>>> ```
import sample_lib sample_lib.package_name 'sample_lib' sample_lib.version '1.0.0'
次のステップ
----
**おめでとうございます!Pythonプロジェクトをパッケージ化して配布しました!** ✨🍰✨
このチュートリアルでは、パッケージをTest PyPIにアップロードする方法を紹介しましたが、Test PyPIは一時的なものです。パッケージとアカウントが削除されることはめずらしいことではありません。実際のPythonパッケージインデックスにパッケージをアップロードしたい場合は、https://pypi.orgでアカウントを登録し、同じ手順でアップロードしてください。ただし、アップロードコマンドで`twine upload dist/*`を使用し、実際のPyPIに登録したアカウントの資格情報を入力してください。実際のPyPIでパッケージをインストールするには`pip install your-package`を使用できます。