setup.pyを用いたPythonパッケージの作成方法
はじめに
この記事は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パッケージの設定をしていきます。
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ファイルを含めるように指定しています。
include LICENSE
include *.md
.pypircファイルの作成
PyPIとTestPyPIへのアカウントは既にあるものとします。
.pypirc
ファイルはPyPiとTestPyPIの設定ファイルになります。
TwineライブラリでPyPIまたはTestPyPIにアップロードするときに読み込ませて使用します。
パスワードを含めることが出来ますが、Gitの管理対象としたいのでここでは含めません。
[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へのアップロードは出来ないことに気を付けて下さい。
# ソースコード形式での配布物の作成
(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パッケージの動作を確かめます。
(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/*