【初心者〜現場で活躍まで】挫折しないPython勉強方法もっと知る

Pythonパッケージ開発入門!初心者向けsetup.pyの使い方をマスター

Pythonパッケージ開発の入り口!初心者向けsetup.pyの使い方をマスター

Pythonは、オブジェクト指向プログラミング言語の一つであり、多くの場面で使われる汎用言語です。Pythonを使うことで、簡単かつ効率的にアプリケーションやツールを開発することができます。

Pythonで開発したアプリケーションやツールを他の人が使えるようにするためには、パッケージ化が必要です。

そこで、本記事では、Pythonパッケージ開発の入り口となる「setup.py」の使い方について初心者向けに解説します。

Pythonの勉強方法は、まとめ記事があります。

Pythonを勉強する時、何から勉強するか分からず、挫折します。初心者でも、中級者でも、レベルに合わせた勉強方法を分かりやすくまとめています。

目次

環境の準備

Pythonパッケージ開発に取り組む前に、まずPythonの環境構築を行う必要があります。

ここでは、Pythonのインストール方法、仮想環境の作成方法について解説します。正しい環境の構築を行うことで、安全で効率的なPythonパッケージ開発を行うことができます。

Pythonのインストール

Pythonをインストールする方法は、OSによって異なりますが、以下に一般的な手順を簡単にまとめます。

  1. 公式サイトからインストーラーをダウンロードする Pythonの公式サイトから、自分のOSに対応したインストーラーをダウンロードします。
  2. インストーラーを実行する ダウンロードしたインストーラーを実行し、表示される指示に従ってインストールを進めます。
  3. PATHを設定する(オプション) PATHを設定することで、コマンドラインからPythonを直接実行できるようになります。Windowsの場合は、環境変数の「Path」にPythonのインストール先を追加します。macOSやLinuxの場合は、.bash_profileや.bashrcなどのシェルスクリプトに、export PATH=$PATH:/usr/local/bin/python(インストール先によって異なります)を追記します。

以上がPythonの一般的なインストール手順ですが、OSや環境によってはさまざまなインストール方法があります。必要に応じて、公式ドキュメントなどを参照してください。

仮想環境の作成

仮想環境を使用することで、異なるプロジェクトで使用されるPythonのバージョンやライブラリーを分離し、衝突を避けることができます。

例えば、プロジェクトAがPython 3.7とDjango 2.2で、プロジェクトBはPython 3.9とDjango 3.1の場合、仮想環境を作成すると、互いに影響しないようにできます。

また、他の開発者と共同開発する場合でも、各開発者でPythonのバージョンとライブラリーを統一できます。

このように、仮想環境を使用すると、Pythonプロジェクトの管理や開発作業が、より効率的で正確になります。

仮想環境を作るなら、venvを使うのが一般的です。使い方は以下の記事で、詳しく解説しています。

基本的なsetup.pyの書き方

setup.pyファイルは以下のように定義します。setup()関数を使って、パッケージのメタデータを定義します。

from setuptools import setup, find_packages

setup(
    name='example_package',
    version='0.1.0',
    packages=find_packages(),
    install_requires=[
        'requests',
        'numpy',
    ],
)

setuptoolsがない場合は、以下でインストールできます。

pip install setuptools

nameはパッケージ名、versionはバージョン番号を表します。

packagesは、パッケージのリストを指定します。この例では、find_packages()を使って、自動的にパッケージを検索しています。

find_packages()は、現在のディレクトリから自動的にパッケージを検索して返す関数です。

このように設定することで、パッケージのモジュールやサブパッケージを自動的に検出し、インストール時に一緒にパッケージ化することができます。

setup.pyを格納するディレクトリ

setup.pyは、パッケージのルートディレクトリに置くのが一般的です。

パッケージのルートディレクトリは、通常、パッケージの名前と同じ名前のディレクトリで、その下にはパッケージのモジュールやサブパッケージが配置されています。

例えば、以下のようなディレクトリ構成を持つパッケージ my_package の場合、setup.pymy_package ディレクトリと同じ階層に置かれます。

my_package/
├── my_package/ # パッケージと同じ名前のフォルダを作成する
│   ├── __init__.py
│   └── module1.py
├── tests/
│   ├── __init__.py
│   └── test_module1.py
├── README.md
├── LICENSE
├── setup.py # ルートディレクトリ直下にsetup.pyを置く
└── requirements.txt

setup.pyで設定できるメタデータ一覧

以下に、setup.pyに設定できるメタデータを整理します。

メタデータ名説明具体例
nameパッケージの名前mypackage
versionパッケージのバージョン番号1.0.0
descriptionパッケージの簡単な説明A simple package for doing something
long_descriptionパッケージの詳細な説明A longer description of the package, possibly including examples
classifiersパッケージの分類情報[Programming Language :: Python, License :: OSI Approved :: MIT License]
keywordsパッケージに関連するキーワードmypackage, example
authorパッケージ作者の名前John Smith
author_emailパッケージ作者のメールアドレスjohn.smith@example.com
urlパッケージのURLhttps://github.com/johnsmith/mypackage
licenseパッケージのライセンスMIT
packagesパッケージに含まれるサブパッケージのリスト[‘mypackage’, ‘mypackage.subpackage’]
install_requiresパッケージが依存するパッケージのリスト[‘numpy’, ‘matplotlib’]
entry_pointsコマンドラインスクリプトのエントリーポイントを指定する{‘console_scripts’: [‘mycommand = mypackage.cli:main’]}
package_dataパッケージに含まれるデータファイルのリスト{‘mypackage’: [‘data/*.txt’]}
setup.pyに設定できるメタデータ

依存関係の設定

パッケージが依存する他のパッケージがある場合は、setup.pyに依存関係します。

install_requiresは、パッケージが依存するパッケージのリストを指定します。

例では、requestsとnumpyパッケージを依存関係として指定しています。

from setuptools import setup, find_packages

setup(
    name='example_package',
    version='0.1.0',
    packages=find_packages(),
    install_requires=[
        'requests',
        'numpy',
    ],
)

これらのパッケージがインストールされていない場合、自動的にインストールされます。

setup.pyでrequirements.txtを使う方法

しかしながら、Pythonでモジュールの依存関係を管理する時は、requirements.txtを利用するのが一般的でおすすめです。

requirements.txtの書き方など詳しい説明は以下。

setup.pyでrequirements.txtを使う場合、以下のように実装します。

from setuptools import setup, find_packages

def requirements_from_file(file_name):
    return open(file_name).read().splitlines()

setup(
    name='example_package',
    version='0.1.0',
    packages=find_packages(),
    install_requires=requirements_from_file('requirements.txt'),
)

install_requiresに、requirements_from_file()関数を利用しています。これにより、setup.pyが実行されるときに、requirements.txtに記載されている依存パッケージが自動的にインストールされます。

これで、開発者が依存するパッケージを明示的に記述し、インストール時に自動的に依存関係を解決できます。

パッケージのビルド

Pythonのパッケージを開発する際には、パッケージをビルドする必要があります。

ビルドとは、Pythonのコードを配布可能な形式(.tar.gzや.zipなど)に変換することです。ビルドしたパッケージは、他の人がインストールしたり、再配布したりできます。

パッケージのビルド形式

パッケージのビルド形式は、「sdist」と「bdist_wheel」の2つがあります。

それぞれの特徴を表にまとめると以下の通りになります。

項目sdistbdist_wheel
ファイル形式tar.gz、zip:ソースコードのアーカイブwheel(.whl):バイナリのアーカイブ
ビルド環境ビルドに必要な環境があれば、どの環境でもビルド可能コンパイル済みバイナリが必要
ビルド速度遅い速い
インストール方法pip install パッケージ名pip install パッケージ名
対応OSすべてのOSで利用可能特定のOS・アーキテクチャのみ
用途主に配布用開発者向け
Pythonパッケージのビルド形式の特徴

パッケージの配布方法としては、sdistよりもbdist_wheelを使うことが推奨されています。

これは、bdist_wheelがsdistよりも高速で、より広範なプラットフォームで動作するからです。しかし、いくつかのプロジェクトでは、パッケージのビルド方法をsdistに固定している場合があります。

パッケージのビルド方法

STEP
wheelのインストール

まずは、ビルドに必要なライブラリをインストールします。以下のコマンドを実行してください。

pip install setuptools wheel

既にインストール済みの場合、この手順はスキップできます。

STEP
setup.pyの作成

パッケージのルートディレクトリにsetup.pyファイルを作成します。setup.pyファイルには、パッケージのメタ情報や依存関係、ビルド設定などを記述します。

from setuptools import setup, find_packages

setup(
    name='mypackage',
    version='0.1',
    packages=find_packages(),
    install_requires=[
        'numpy',
        'pandas',
    ],
)

既に作成済みの場合、この手順はスキップできます。

STEP
パッケージをビルド

setup.pyファイルを作成したら、以下のコマンドを実行してパッケージをビルドします。

python setup.py sdist bdist_wheel

このコマンドを実行すると、distフォルダの直下に、sdist(形式はtar.gzやzip)とbdist_wheel(.whl)という2つのアーカイブファイルが作成されます。

  • sdist:ソースコードのアーカイブ
  • bdist_wheel:バイナリのアーカイブ
STEP
パッケージのインストール

ビルドしたパッケージを別のプロジェクトで使用したい場合、以下のようにインストールができます。

# sdistのインストール方法
pip install dist/{パッケージ名}-{バージョン番号}.tar.gz

# bdist_wheelのインストール方法
pip install dist/{パッケージ名}-{バージョン番号}-py3-none-any.whl

パッケージのバージョン管理

パッケージのバージョン管理は、パッケージの開発・保守において重要な作業のひとつです。バージョン番号を上げることで、機能の追加やバグ修正を明示できます。

パッケージのバージョンは、 setup.py ファイルの中の version という項目で指定します。

setup.pyでバージョン番号を管理することで、パッケージのバージョンを一元管理でき、利用者はバグ修正や新機能の追加など、変更履歴の追跡がしやすくなります。

パッケージの依存関係も明確になり、パッケージのアップグレードや再インストールが簡単になります。

ということで、パッケージのバージョン管理は、開発者・利用者、お互いにメリットがあります。

バージョン番号の付け方

バージョン番号は、 major.minor.patch の3つの数字で成り立ち、major はメジャーバージョン、 minor はマイナーバージョン、 patch はパッチバージョンを表します。

例えば、0.1.0 というバージョン番号は、メジャーバージョンが 0、マイナーバージョンが 1、パッチバージョンが 0 を表します。

バージョン番号の付け方を整理したのが、以下です。

バージョン番号の付け方
  • major:大きな変更を加えた場合。例えば、API の仕様変更や大幅な機能変更など。
  • minor:機能追加やバグ修正をした場合。例えば、新しい機能の追加や既存機能の改善、バグの修正など。
  • patch:バグ修正や文言修正をした場合。例えば、既存の機能に対する軽微な修正やドキュメントの修正など。

Semantic Versioning (セマンティック バージョニング)の紹介

Semantic Versioning (セマンティック バージョニング) は、バージョン番号のルールを統一することで、バージョン番号の解釈を簡単にするという考え方です。

Semantic Versioningには以下のルールがあります。

  • 互換性が保たれない変更を加えた場合は、major を上げます。
  • 互換性が保たれた新しい機能を加えた場合は、minor を上げます。

Semantic Versioningのルールに従ってバージョン番号を付けることで、他の開発者やユーザーにとってバージョン番号が意味を持ち、開発プロセスを予測しやすくなります。

テストの実行方法

テストは品質保証のために欠かせないものです。

setuptoolsを使ってパッケージをビルドし、インストールした場合、同梱されているsetup.pyファイルを利用してテストを実行することができます。

setup.pyにはtestコマンドが定義されており、このコマンドを実行することでテストが実行されます。

テストコードは通常、testsというディレクトリに格納され、unittestモジュールやpytestモジュールなどを使用して書かれます。

以下はsetuptoolsを使用したsetup.pyの例

from setuptools import setup, find_packages
import unittest

def my_test_suite():
    test_loader = unittest.TestLoader()
    test_suite = test_loader.discover('tests', pattern='*_test.py')
    return test_suite

setup(
    name='my_package',
    version='0.1.0',
    packages=find_packages(),
    install_requires=[
        'numpy',
        'pandas'
    ],
    tests_require=[
        'pytest'
    ],
    test_suite='setup.my_test_suite'
)

上記の例では、testsディレクトリ内の*_test.pyという名前のファイルをテストコードとして実行するように設定しています。また、tests_requirepytestを指定することで、テスト用のライブラリとしてpytestを使用するように設定しています。

テストを実行するには、以下のようにsetup.pyがあるディレクトリでtestコマンドを実行します。

python setup.py test

pytestの使い方は以下で詳しく解説しています。

setup.pyのよくある質問

setup.pyのよくある質問を以下にまとめます。

setup.pyとは何ですか?

setup.pyは、Pythonパッケージをビルド、インストール、配布するためのスクリプトです。

setup.pyはどこに配置されますか?

通常、パッケージのルートディレクトリに配置されます。

setup.pyを作成するには、どのようなステップが必要ですか?

setup.pyを作成するためには、パッケージ情報、依存関係、ビルド手順が必要です。

setup.pyでどのようなパッケージ情報を設定できますか?

パッケージ名、バージョン、著作権、作者、メールアドレス、URLなどが設定できます。

setup.pyでどのように依存関係を設定できますか?

install_requiresを使って、必要な依存パッケージを指定することができます。

sdistとbdist_wheelの違いは何ですか?

sdistはソースディストリビューションで、bdist_wheelはバイナリディストリビューションです。

setup.pyでインストール先を指定するにはどうすればいいですか?

--prefixオプションを使用するか、setup.cfginstall_libを指定することで、インストール先を指定できます。

setup.pyでコマンドラインツールを登録するにはどうすればいいですか?

entry_pointsを使用して、コマンドラインツールを登録することができます。

setup.pyでテストを実行するにはどうすればいいですか?

setup.py testを実行することで、テストを実行できます。

Python学習におすすめのコンテンツ

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

Udemyの講座でPythonなら、文句なしにおすすめ

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
総合評価
( 5 )
メリット
  • 分かりやすい言葉や具体的なコードで工夫して説明しているので、初心者でも理解できる。
  • 初心者でも挫折しないように、丁寧に詳しく手順を説明している。
  • 講座内で取り扱う課題は実践的なものが多く、書籍では身につかない応用力を身につけられる。
デメリット
  • 情報量が多いのに、講座の進み方が速いので、一回では理解が追いつかない。
  • 課題の難易度が高すぎる場合がある。
  • 講師のアクセントが特殊で、聞き取りにくいと感じたことがある。

テスト駆動Python 第2版

日本語で唯一、pytestだけに焦点を当てて、詳細に書かれた書籍です。

テスト駆動Python第2版
総合評価
( 5 )
メリット
  • 日本語でpytestの全てについて、解説されている唯一の書籍
  • 段々とステップアップして、深くなるので、初心者でも、中級者でも、上級者でも、学びがある
  • サンプルコードには、サンプルアプリが含まれているため、実践的に学べる工夫あり
  • 章末にまとめがあり、復習の役に立つ
  • 第7章に「どのようなテストを書くのか」についての解説があり、テストに対する考え方が深まる
デメリット
  • 後半になると、かなり高度な内容になるため、初心者には難しい
  • タイトルに「テスト駆動開発」と書かれているが、該当部分の記述が少なく、テスト駆動開発を知りたい人は期待外れになるかも
エソラ

間違えて、第1版を買わないように注意して下さい。

著:Brian Okken, 翻訳:株式会社クイープ, 監修:株式会社クイープ, 監修:安井 力
¥1,650 (2024/04/19 12:22時点 | Amazon調べ)

おわりに

setup.pyは、Pythonパッケージの開発・配布に欠かせないツールのひとつです。

エソラ

本記事では、setup.pyの基本的な使い方から応用的な使い方までを解説しました。

setup.pyの使い方を理解することで、現場での開発の幅が広がると思います。Pythonパッケージの開発・保守を行う際には、ぜひ本記事を参考にしてください。

Pythonの勉強方法は、まとめ記事があります。

Pythonを勉強する時、何から勉強するか分からず、挫折します。初心者でも、中級者でも、レベルに合わせた勉強方法を分かりやすくまとめています。

ここまでお読みいただき、ありがとうございました。

役に立った、面白かったと思ったら、SNSでシェアしてくれると嬉しいです。

エソラ

もし分からないことがあれば、お問い合わせTwitterにご連絡をいただけると嬉しいです。(Twitterの方が返信早いかも…)

\ 更新の励みになるので、ポチッとしてね /

エソラ

他にもスキルアップやキャリアアップの役に立つ情報が満載です。他の記事も読んで、ゆっくりしていってね!

Pythonパッケージ開発の入り口!初心者向けsetup.pyの使い方をマスター

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次