setup.pyを用いたPythonパッケージの作成方法

公開:2020/12/24
更新:2020/12/25
3 min読了の目安(約3500字TECH技術記事

はじめに

この記事はsetup.pyを用いてPythonパッケージを作成する方法を備忘録として残すことを目的に書きます。Pythonパッケージをソースコード形式とwheel形式で作成し、PyPIに登録するところまでを行います。
この記事ではfilessというCLIアプリで作成しており、最終的には以下のようなパッケージ構成になります。

filess  # プロジェクトルートディレクトリ
├── .gitignore
├── .pypirc
├── LICENSE
├── MANIFEST.in
├── README.md
├── build
├── dist  # 配布物
├── filess  # 配布するPythonパッケージのソースコード
├── filess.egg-info
├── requirements.lock
├── requirements.txt
├── setup.py  # Pythonパッケージの情報
└── venv

この記事が他の人の参考になれば幸いです。
また、この記事の内容に間違った記載がありましたら、指摘していただけるとありがたいです。

環境

2020年12月23日時点。

名前 バージョン
macOS Big Sur 11.1
Python 3.9.0

setup.pyの作成

setup.pyはPythonパッケージを作成するためのPythonモジュールです。
このモジュールにsetup関数を記載し、引数として様々な情報を渡すことでPythonパッケージの設定をしていきます。

setup.py
from setuptools import find_packages, setup

try:
    with open('README.md', 'r', encoding='utf-8') as f:
        long_description = '\n' + f.read()
except FileNotFoundError:
    long_description = ''

setup(
    name='Pythonパッケージ名',
    version='0.1.0',
    description='短いPythonパッケージの説明',
    long_description=long_description,  # README.mdを読み込んで長いPythonパッケージの説明
    long_description_content_type='text/markdown',
    url='GitHubなどのPythonパッケージのURL',
    author='作者名',
    author_email='作者のemailアドレス',
    python_requires='~=3.6',  # 要求するPythonのバージョン ここでは3.6以上4未満

    packages=find_packages(exclude=['tests', '*.tests', '*.tests.*', 'tests.*']),
    # スクリプトインターフェースの登録
    # Python3コマンドを使用せずに作成したプログラムを実行したいため
    entry_points={
        'console_scripts': [
            'filess=filess.core:cli'
        ]
    },
    # 直接依存しているPythonライブラリ
    install_requires=[
        'typer',
    ],
    # PyPI上での検索や閲覧のために利用される分類
    classifiers=[
        'License :: OSI Approved :: MIT License',
        'Programming Language :: Python',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.9',
        'Programming Language :: Python :: Implementation :: CPython',
    ],
)

setup.py以外の設定ファイルの作成

MANIFEST.inファイルの作成

MANIFEST.inファイルはソースコード以外に配布物に含めるものを指定するファイルです。
ここではライセンスとMarkdownファイルを含めるように指定しています。

MANIFEST.in
include LICENSE
include *.md

.pypircファイルの作成

PyPIとTestPyPIへのアカウントは既にあるものとします。
.pypircファイルはPyPiとTestPyPIの設定ファイルになります。
TwineライブラリでPyPIまたはTestPyPIにアップロードするときに読み込ませて使用します。
パスワードを含めることが出来ますが、Gitの管理対象としたいのでここでは含めません。

.pypirc
[distutils]
index-servers =
  pypi
  testpypi

[pypi]
repository=https://upload.pypi.org/legacy/
username=<PyPIアカウントのユーザー名>

[testpypi]
repository=https://test.pypi.org/legacy/
username=<TestPyPIアカウントのユーザー名>

配布物の作成とTestPyPIへのアップロード

以下のような手順でTestPyPiへPythonパッケージをアップロードします。
配布物はdistディレクトリに作成されます。些細な変更であっても同じバージョンでPyPIまたはTestPyPIへのアップロードは出来ないことに気を付けて下さい。

terminal
# ソースコード形式での配布物の作成
(venv) $ python3 setup.py sdist

# wheel形式での配布物の作成
(venv) $ pip install wheel
(venv) $ python3 setup.py bdist_wheel

# TestPyPIへのアップロード
(venv) $ pip install twine
(venv) $ twine upload -r testpypi dist/*

Pythonパッケージの動作確認とPyPIへのアップロード

新しい仮想環境を作成して、アップロードしたPythonパッケージの動作を確かめます。

terminal
(venv) $ deactivate
# PythonパッケージをTestPyPIからインストールして確認するための仮想環境の作成
$ python3 -m venv env
$ . env/bin/activate
(env) $ pip install -i https://test.pypi.org/simple/ filess

正しく動作していた場合はPyPIへアップロードします。

(venv) $ twine upload -r pypi dist/*

参考