Pipenvと仮想環境

https://farm3.staticflickr.com/2943/33485660921_dfc0494739_k_d.jpg

このチュートリアルでは、Pythonのパッケージをインストールして使う体験をしてもらいます。

このチュートリアルは必要とするツールをインストールして使う方法を解説し、ベストプラクティスを強く推奨するものです。 Pythonは非常に多岐に渡る目的に使われていて、依存関係をどのように管理したいかは厳密には、どのようにソフトウェアの公開を決めるかによって変わるかもしれないことを心に留めておいてください。 このガイダンスを直接適用するのに一番向いているのは、(Webアプリケーションを含む) ネットワークサービスの開発とデプロイですが、どんな種類のプロジェクトの開発環境やテスト環境の管理にも非常によく適したものになっています。

注釈

このガイドはPython 3向けに書かれていますが、とある理由でまだPython 2.7を使っている場合でも、それぞれの指示はきちんと動くでしょう。

☤ Pythonとpipがあるかの確認

先に進む前に、Pythonがインストールしてあって、コマンドラインから使えることを確認してください。 次のコマンドを実行して確認できます:

$ python --version

3.6.2 のような表示が出力されたと思います。 もしPythonをインストールしていなかったら、 python.org から最新のバージョン3.xをインストールするか、 The Hitchhiker's Guide to PythonInstalling Python 節を参照してください。

注釈

もしあなたが初心者で次のようなエラーが出てしまったら:

>>> python
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'python' is not defined

このエラーが起きたのは、 python コマンドは シェル (ターミナルコンソール とも呼ばれます) で動かすものだからです。 Python for Beginnersというサイトの getting started tutorial を参照し、OSのシェルの使い方やPythonとやり取りする入門をしてください。

さらに、pipが使える状態にあるかを確認する必要があります。 次のコマンドを実行して確認できます:

$ pip --version
pip 9.0.1

ソースコードや python.org のインストーラーや HomebrewLinuxbrew からPythonをインストールした場合は、既にpipがインストールされているはずです。 Linuxを使っていて、OSのパッケージマネージャーを使ってインストールした場合には、それとは別に pipのインストール をしなければならないかもしれません。

HomebrewまたはLinuxbrewを使ってPipenvをインストールするつもりの場合は、この手順はスキップできます。 HomebrewあるいはLinuxbrewのインストーラはpipの面倒も見てくれます。

☤ Pipenvのインストール

PipenvはPythonプロジェクトのための依存関係管理ツールです。 もしNode.jsの npm やRubyの bundler に馴染みがあるなら、Pipenvはそれらのツールとやりたいことはよく似ています。 pipはPythonのパッケージをインストールできますが、Pipenvは通常のユースケースでの依存関係管理を簡単にするより高度なツールとして推奨されています。

☤ HomebrewでのPipenvのインストール方法

Homebrew はmacOSの人気のあるオープンソースパッケージマネージシステムです。 Linuxユーザーのために、Homebrewを移植したのが Linuxbrew です。

HomebrewやLinuxbrewでpipenvをインストールするとpipenvとその依存パッケージを隔離された仮想環境に閉じ込めるので、他のインストールされているPythonに影響は与えません。

HomebrewあるいはLinuxbrewがインストールできたら次のコマンドを実行します:

$ brew install pipenv

いつでもPipenvをアップグレードするには次のコマンドを実行します:

$ brew upgrade pipenv

☤ pipenvの実用的なインストール方法

もしインストールされた今も使っているpipがあって、ある "ツール群" タイプのPythonモジュールをどの環境でも使うユーティリティとしてメンテナンスしている場合は、pip の ユーザーインストール を使うとホームディレクトリにインストールできます。 依存関係どうしの影響の関係で、この方法でインストールするツールは、virtualenv、Pipenv、toxのようなPythonを使う作業の工程のための基本要素となるソフトウェアだけに制限すべきという点に注意してください。

次のコマンドでインストールします:

$ pip install --user pipenv

注釈

このコマンドは user installation を行い、システム全体に関わるパッケージを壊さないようにします。 インストールを行った後に pipenv が使えるようにならない場合は、 user base のバイナリディレクトリを PATH に追加する必要があります。

LinuxとmacOSでは python -m site --user-base を実行してユーザーのベースバイナリディレクトリを見付け、その末尾に bin を追加します。 例えば、このコマンドはたいてい ~/.local (~ はあなたのホームディレクトリの絶対パスへ展開されたもの) なので、 ~/.local/binPATH に追加する必要があります。 ~/.profile を修正 すると PATH に行った設定が再起動しても消えません。

Windows では python -m site --user-site を実行してユーザーのベースバイナリディレクトリを見付け、 site-packagesScripts で置き換えます。 例えば、このコマンドは C:\Users\Username\AppData\Roaming\Python36\site-packages のようなパスを返すので、 C:\Users\Username\AppData\Roaming\Python36\ScriptsPATH に含める必要があります。 コントロールパネル でユーザー環境変数の PATH に設定すると再起動しても消えません。 PATH の変更を有効にするには一度ログアウトする必要があるかもしれません。

さらに詳しいことは ユーザーインストールの説明 を参照してください。

いつでもPipenvをアップグレードするには次のコマンドを実行します:

$ pip install --user --upgrade pipenv

☤ 大雑把なPipenvのインストール方法

もしpipをまだインストールしていなくても、この大雑把なインストール方法を使って、Pipenvのシステム全体を立ち上げられます:

$ curl https://raw.githubusercontent.com/kennethreitz/pipenv/master/get-pipenv.py | python

☤ プロジェクトで使うパッケージのインストール

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]...
P.S. You have excellent taste! ✨ 🍰 ✨

☤ インストールされたパッケージを使う

これでRequestsがインストールされたので、単純な main.py ファイルを作成し、Requestsを使えます:

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は自動的にプロジェクトをそれ専用の仮想環境に対応付けます。
  • 仮想環境は、プロジェクトのルートディレクトリにそのパスのハッシュを付け足した名前(例えば、 my_project-a3de50)で共通の場所に保存されます。
  • プロジェクトのパスを変更した場合は、そのデフォルトの対応付けは壊れてしまい、Pipenvはプロジェクトの仮想環境を見付けることも、使用することもできなくなります。
  • 後でパスを変更して起きる問題を避けるために、.bashrcか.zshrc(あるいは他のシェル設定ファイル)に export PIPENV_VENV_IN_PROJECT=1 を設定して、プロジェクトのディレクトリ内に仮想環境を作るようにするのも良いでしょう。

☤ 次のステップ

おめでとうございます、Pythonのパッケージをインストールして使う方法が学べました! ✨ 🍰 ✨