メインコンテンツへスキップ
  1. ノート/
  2. ツールとデプロイ/

Python pip用setup.pyの書き方

·1214 文字·3 分· loading · loading · · ·
ICE345
著者
ICE345
CS Student | System | Linux | OCaml
新しい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. 主な引数
#

nameversion
#

  • 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.pymain()関数があれば、インストール後に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 build

dist/にソース配布物とWheelが生成されます。ローカルへインストールして確認します。

python -m pip install .
awesome-tool

古いプロジェクトでは次のコマンドも見かけます。

python setup.py sdist bdist_wheel

ただし、新規プロジェクトではpython -m buildpyproject.tomlを優先してください。

6. よくある注意点
#

  1. PyPI上のパッケージ名が重複していないか確認する。
  2. バージョンを更新してから再配布する。
  3. 依存ライブラリのバージョン範囲を適切に指定する。
  4. LICENSEとREADMEを配布物へ含める。
  5. entry_pointsのモジュール名と関数名が実際のコードと一致しているか確認する。
  6. 秘密鍵、トークン、パスワードをsetup.pyへ書き込まない。

まとめ
#

setup.pyでは、Pythonパッケージのメタデータ、依存関係、パッケージデータ、CLIコマンドを定義できます。既存コードの保守には有用ですが、新しいパッケージではpyproject.tomlを使う構成も検討してください。

関連記事


评论