新しいPythonプロジェクトでは、
pyproject.tomlを使う方式が現在の標準です。ただし、既存プロジェクトやsetuptoolsの学習ではsetup.pyもまだ役立ちます。1. 基本構造#
setup.pyは、パッケージ名、バージョン、依存ライブラリ、配布ファイル、コマンドラインエントリーポイントなどを定義するPythonファイルです。
from setuptools import find_packages, setup
setup(
name="your-package-name",
version="0.1.0",
author="Your Name",
author_email="your@email.com",
description="Short description",
long_description=open("README.md", encoding="utf-8").read(),
long_description_content_type="text/markdown",
url="https://github.com/yourusername/your-package",
packages=find_packages(),
install_requires=[],
entry_points={},
classifiers=[
"Programming Language :: Python :: 3",
"Operating System :: OS Independent",
],
python_requires=">=3.9",
)2. 主な引数#
nameとversion#
name:PyPI上のパッケージ名。すでに使われていない名前を選ぶ。version:パッケージのバージョン。更新時は規則に従って値を上げる。
packages#
パッケージとして含めるディレクトリを指定します。
packages=find_packages()find_packages()は、通常__init__.pyを持つパッケージを自動的に探します。手動で指定する場合は次のように書きます。
packages=["my_package", "my_package.submodule"]install_requires#
実行に必要な依存ライブラリを指定します。
install_requires=[
"requests>=2.25.1",
"numpy>=1.20,<2",
"pandas",
]entry_points#
コマンドラインコマンドを生成します。
entry_points={
"console_scripts": [
"my-command=my_package.module:main",
],
}my_package/module.pyにmain()関数があれば、インストール後にmy-commandとして実行できます。
package_data#
パッケージ内のJSON、テンプレート、CSVなど、Pythonコード以外のファイルを含めます。
package_data={
"my_package": ["data/*.json", "templates/*.html"],
}MANIFEST.inと組み合わせる場合は、include_package_data=Trueも指定します。
3. プロジェクト構造#
my_project/
├── my_package/
│ ├── __init__.py
│ ├── main.py
│ └── data/
│ └── config.json
├── README.md
├── LICENSE
└── setup.pyこの構造なら、次のようにパッケージを設定できます。
from setuptools import find_packages, setup
setup(
name="my-awesome-tool",
version="0.1.0",
packages=find_packages(),
install_requires=["requests>=2.25.1", "click>=8.0"],
entry_points={
"console_scripts": [
"awesome-tool=my_package.main:main",
],
},
package_data={
"my_package": ["data/*.json"],
},
python_requires=">=3.9",
)4. MANIFEST.in#
配布物へパッケージ外のドキュメントやテストデータを含めたい場合は、MANIFEST.inを作成します。
include LICENSE README.md
recursive-include docs *
recursive-include tests *5. ビルドとインストール#
python -m pip install --upgrade build
python -m builddist/にソース配布物とWheelが生成されます。ローカルへインストールして確認します。
python -m pip install .
awesome-tool古いプロジェクトでは次のコマンドも見かけます。
python setup.py sdist bdist_wheelただし、新規プロジェクトではpython -m buildとpyproject.tomlを優先してください。
6. よくある注意点#
- PyPI上のパッケージ名が重複していないか確認する。
- バージョンを更新してから再配布する。
- 依存ライブラリのバージョン範囲を適切に指定する。
LICENSEとREADMEを配布物へ含める。entry_pointsのモジュール名と関数名が実際のコードと一致しているか確認する。- 秘密鍵、トークン、パスワードを
setup.pyへ書き込まない。
まとめ#
setup.pyでは、Pythonパッケージのメタデータ、依存関係、パッケージデータ、CLIコマンドを定義できます。既存コードの保守には有用ですが、新しいパッケージではpyproject.tomlを使う構成も検討してください。


