アプリケーションの依存関係を管理する#

パッケージインストールに関するチュートリアル には、 Python のパッケージをインストールしたり更新したりするための準備の基本が説明されています。

しかしながら、これらのコマンドを対話形式で実行することは、自分自身の個人的なプロジェクト向けであってもうんざりする作業になりかねないし、複数の貢献者が参加するようなプロジェクト向けに開発環境を自動的に設定することを試みる場合にはもっと困難にさえなるでしょう。

このチュートリアルでは、 Pipenv を使ってアプリケーションの依存関係を管理する方法について一通り見て回ります。必要なツール群のインストールの仕方もお見せしますし、ベストプラクティスについても強い推奨をします。

覚えておいてもらいたいのは、 Python が極めて多岐に渡る目的に使用されるということと、あなたが自分のソフトウェアを公開するやり方によって依存関係を管理する正確なやり方が変化するであろうということです。ここに書かれているガイダンスは、ネットワークサービス (web アプリケーションを含む) の開発やデプロイメントには最も直接的に適用できますが、どんな種類のプロジェクトであってもその開発や試験のための環境を管理するのにとても適切であると言えるでしょう。

他の手段については、 アプリケーションの依存関係管理のための他のツール群 を見てください。

Pipenv をインストールする#

Pipenv は Python のプロジェクトの依存関係を管理するツールです。 Node.js での npm や Ruby の bundler を知っているなら、意図するところはこれらのツールと同じです。個人で使う分には pip さえあれば十分であることが多いですが、共同作業を伴うプロジェクトでは、多くのユースケースにおいて依存関係管理を単純化する上位のツールとして Pipenv が推奨されています。

pip を使って Pipenv をインストールする:

python3 -m pip install --user pipenv
py -m pip install --user pipenv

注釈

これは、システムワイドにインストールされたパッケージ群を破壊しないように、 ユーザインストール を行います。インストール後にシェルから pipenv が利用できない場合は、 ユーザベース のバイナリディレクトリを PATH 変数に追加する必要があるでしょう。詳しくは、 ユーザサイトにインストールする を見てください。

プロジェクト用にパッケージをインストールする#

Pipenv は、プロジェクト毎に依存関係を管理します。パッケージをインストールするには、まずプロジェクト (このチュートリアル用にはからのディレクトリへ行けば十分) のディレクトリへ行って、以下のコマンドを実行してください:

cd myproject
pipenv install requests

Pipenv は、 Requests ライブラリをインストールし、プロジェクトのディレクトリに Pipfile を作成するでしょう。 Pipfile は、そのプロジェクトを共有している場合などのように、再インストールが必要な時にそのプロジェクトが必要とする依存関係を追跡するために使われます。 (正確なディレクトリパスは変化するとしても) これに似た出力が表示されるべきです:

Creating a Pipfile for this project...
Creating a virtualenv for this project...
Using base prefix '/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6'
New python executable in ~/.local/share/virtualenvs/tmp-agwWamBd/bin/python3.6
Also creating executable in ~/.local/share/virtualenvs/tmp-agwWamBd/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: ~/.local/share/virtualenvs/tmp-agwWamBd
Installing requests...
Collecting requests
  Using cached requests-2.18.4-py2.py3-none-any.whl
Collecting idna<2.7,>=2.5 (from requests)
  Using cached idna-2.6-py2.py3-none-any.whl
Collecting urllib3<1.23,>=1.21.1 (from requests)
  Using cached urllib3-1.22-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests)
  Using cached chardet-3.0.4-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests)
  Using cached certifi-2017.7.27.1-py2.py3-none-any.whl
Installing collected packages: idna, urllib3, chardet, certifi, requests
Successfully installed certifi-2017.7.27.1 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22

Adding requests to Pipfile's [packages]...

インストール済みのパッケージを使う#

今や、Requests がインストールされたので、それを使うために単純な main.py ファイルを作成しましょう:

import requests

response = requests.get('https://httpbin.org/ip')

print('Your IP is {0}'.format(response.json()['origin']))

続いて pipenv run を使ってこのスクリプトを走らせます:

pipenv run python main.py

大体こんな感じの出力が得られるはずです:

Your IP is 8.8.8.8

pipenv run を使うことで、インストール済みのパッケージを確実にスクリプトから利用できるようになります。pipenv shell で新しいシェルを立ち上げれば、あらゆるコマンドからインストール済みパッケージへのアクセスが保証されます。

次なる一歩#

おめでとう、今やあなたは、共同作業を必要とする Python プロジェクトにおいて、依存関係や開発環境を効率良く管理する方法をご存知です!✨ 🍰 ✨

自分で Python パッケージを作成したり配布したりすることに興味があるなら、 パッケージングとパッケージ配布のためのチュートリアル を見てください。

あなたのアプリケーションが Python ソースコードパッケージの定義を含んでいる場合には、 pipenv install -e <relative-path-to-source-directory> (例えば pipenv install -e .pipenv install -e src) によって、 (その依存先も含めて) それがあなたの pipenv 環境にインストールされ得ることに注意してください。

アプリケーションの依存関係管理のためのその他のツール#

アプリケーションの依存関係管理で、あなたのユースケースではこの特定のアプローチがあまりうまく働かないことがわかったならば、この後にアルファベット順に列挙する他のツール群やテクニックがより上手く使えるかどうか試してみたくなるかもしれません:

  • hatch は、プロジェクト管理のワークフローにおいて、バージョン番号の増やし方やテンプレートから新しいスケルトンプロジェクトを作成するやり方など、ステップ数は増えてもこだわりのあるやり方でやろうとするツールです。

  • micropipenv は、 pip に対する軽量のラッパで requirements.txt や Pipenv や Poetry のロックファイル、あるいはそれらを pip ツールと互換性のある形への変換出力をサポートするツールです。コンテナ化された Python アプリケーションのために設計されましたが、用途はそれに限りません。

  • PDM は、 PEP 517PEP 621 のような標準に立脚した近代的な Python パッケージ管理ツールです。

  • pip-tools は、プロジェクト内で直接使われているパッケージのリストから全ての依存関係のロックファイルを生成するツールで、依存関係に現れるものだけがインストールされていることを保証します。

  • Poetry は、そのカバーする範囲という点で Pipenv と互換性のあるツールで、 pyproject.toml ファイルを使った配布可能な Python パッケージとしてプロジェクト管理のユースケースが構成されている場合にもっと直接に使用することに焦点を当てたものです。これとは対照的に、 Pipenv は明示的に、 (開発) 作業中のアプリケーションが pip でインストール可能な Python パッケージとしての配布をサポートしているという仮定を置くことを避けています。