【Python】パッケージ配布 ~ setuptoolsあれこれ ~

■ はじめに

https://dk521123.hatenablog.com/entry/2024/03/19/000000

で、setuptoolsを使ったが、今日、色々と不具合対応して
学んだことがあったので、メモしておく

目次

【1】setup.py の 文法
 1)entry_points
【2】ヘルパー関数 find_packages()
 1)構文
 2)使用上の注意
【3】MANIFEST.in
 1)サンプル

【1】setup.py の 文法

https://github.com/pypa/sampleproject/blob/db5806e0a3204034c51b1c00dde7d5eb3fa2532e/setup.py

from setuptools import setup, find_packages

setup(
    name="sampleproject",  # Required
    version="2.0.0",  # Required
    description="A sample Python project",  # Optional
    long_description=long_description,  # Optional
    long_description_content_type="text/markdown",  # Optional (see note above)
    url="https://github.com/pypa/sampleproject",  # Optional
    author="A. Random Developer",  # Optional
    author_email="author@example.com",  # Optional
    classifiers=[  # Optional
        "Development Status :: 3 - Alpha",
        "Intended Audience :: Developers",
        "Topic :: Software Development :: Build Tools",
        "License :: OSI Approved :: MIT License",
        "Programming Language :: Python :: 3",
        "Programming Language :: Python :: 3.7",
        "Programming Language :: Python :: 3.8",
        "Programming Language :: Python :: 3.9",
        "Programming Language :: Python :: 3.10",
        "Programming Language :: Python :: 3 :: Only",
    ],
    keywords="sample, setuptools, development",  # Optional
    package_dir={"": "src"},  # Optional
    packages=find_packages(where="src"),  # Required
    python_requires=">=3.7, <4",
    install_requires=["peppercorn"],  # Optional
    extras_require={  # Optional
        "dev": ["check-manifest"],
        "test": ["coverage"],
    },
    package_data={  # Optional
        "sample": ["package_data.dat"],
    },
    entry_points={  # Optional
        "console_scripts": [
            "sample=sample:main",
        ],
    },
    project_urls={  # Optional
        "Bug Reports": "https://github.com/pypa/sampleproject/issues",
        "Funding": "https://donate.pypi.org",
        "Say Thanks!": "http://saythanks.io/to/example",
        "Source": "https://github.com/pypa/sampleproject/",
    },
)

1)entry_points

* 実行するファイルと関数を指定

ディレクトリ構成例

democli
├── demo
│   ├── __init__.py
│   └── hello.py

setup.py

    entry_points={
        "console_scripts": [
            #  demo/hello.py の main 関数を指定
            "demo=demo.hello:main",
        ]
    },

【2】ヘルパー関数 find_packages()

* setup.py の packages について、固定でも指定可能だが
 find_packages()を使った方が、便利

1)構文

    packages=find_packages()

Options
https://setuptools.pypa.io/en/latest/userguide/quickstart.html#package-discovery

from setuptools import setup, find_packages  # or find_namespace_packages

setup(
    # ...
    packages=find_packages(
        # All keyword arguments below are optional:
        where='src',  # '.' by default
        include=['mypackage*'],  # ['*'] by default
        exclude=['mypackage.tests'],  # empty by default
    ),
    # ...
)

2)使用上の注意

* package に「__init__.py」がないと
 パッケージとして認識されないので注意

ディレクトリ構成例

democli
├── demo
│   ├── sample
│   │       └──  world.py <- 「__init__.py」がないので「demo.sample」は認識されない
│   ├── __init__.py <- 「__init__.py」があるので「demo」は認識される
│   └── hello.py

【3】MANIFEST.in

* 設定ファイルを追加した場合とかに使う

https://packaging.python.org/ja/latest/guides/distributing-packages-using-setuptools/#manifest-in

より抜粋
~~~~~~~~~
自動的に追加されるファイル以外のファイルをソースコード配布物に追加したい場合には、
MANIFEST.in が必要になります。 
どんなファイルがデフォルトで自動的に追加されるのかも含めて、
MANIFEST.in の書き方の詳細については「MANIFEST.in の使い方」を見てください。
~~~~~~~~~

MANIFEST.in の使い方
https://setuptools.pypa.io/en/latest/userguide/miscellaneous.html#using-manifest-in

1)サンプル

https://github.com/sqlfluff/sqlfluff/blob/main/plugins/sqlfluff-plugin-example/MANIFEST.in

# 「src/sqlfluff_plugin_example/plugin_default_config.cfg」を追加
include src/sqlfluff_plugin_example/plugin_default_config.cfg

参考文献

MANIFEST.in
https://nikkie-ftnext.hatenablog.com/entry/python-packaging-setup-include-package-data-with-manifest-in

関連記事

パッケージ配布 ~ setup.pyによる作成方法 ~
https://dk521123.hatenablog.com/entry/2024/03/19/000000
パッケージ配布 ~ pyproject.tomlによる作成方法 ~
https://dk521123.hatenablog.com/entry/2024/03/28/000000
egg / wheel ファイルを作成する
https://dk521123.hatenablog.com/entry/2020/02/09/234350
パッケージ管理 ~ pip ~
https://dk521123.hatenablog.com/entry/2021/07/02/000000
オフライン環境下で pip install するには
https://dk521123.hatenablog.com/entry/2021/07/10/164833