サイトアイコン テクてくTech

意外と簡単だった、PipenvでPython仮想環境を構築

最近は一人プロジェクトが多いため、開発環境のパッケージ管理や仮想環境がおざなりになっていましたが、将来プロジェクトが拡大した時に痛い目に遭わないよう今のうちに仮想環境を導入することにしました。

隣のプロジェクトがパッケージ管理周りでプチ炎上していたため、対岸の火ではなく自分事化することにします。

最近のPythonでの仮想環境はpipenvがデファクトになりつつあるということで早速導入してみました。

ad

pipenvとは

公式ドキュメントより

Pipenvは、Pythonプロジェクトのための仮想環境を作成するために必要なすべての手段を提供するツールです。パッケージをインストールまたはアンインストールするときに Pipfile ファイルを介して自動的にプロジェクトパッケージを管理します。

Pythonの仮想環境とライブラリの管理をまとめて操作できる便利ツールといった感じです。
仮想環境とライブラリ管理については以下のような認識をもちまました。

環境

検証したPCの環境は以下のとおりです。

PC:MacBookAir 2018
OS:macOS Mojave 10.14.6
パッケージソフト:brew
仮想環境:~/python/pipenv1st

手順

ひとまずインストールから基本的な使い方をまとめて紹介します。

pipenvのインストール

MacのデフォルトPythonはVer2系なため、Python3のインストールが必要となります。
Python3インストール後はpip3を利用してpipenvをインストールして下さい。

$ brew install python3
$ pip3 install pipenv

仮想環境作成

仮想環境のディレクトリを作成してデフォルトPythonのバージョンを3系に指定します。
本当にこれだけで仮想環境の構築ができました。

$ mkdir -p ~/python/pipenv1st #仮想環境ディレクトリを作成
$ cd ~/python/pipenv1st #仮想環境ディレクトリに移動
$ pipenv install --python 3 # Python3で初期化

パッケージのインストール

--devオプションを指定して開発環境のみにリンカー(flake8)をインストールします。
--dev引数を指定した場合は開発環境にのみ適用されると識別され、本番環境や検証環境に配布する際には除外されます。

今回はjupyter notebookを正規のパッケージとしてインストールするため、--devオプションを指定しないことで正規のパッケージとしています。
これでjupyter notebookが依存するパッケージ群も自動でインストールしてくれました。

$ pipenv install --dev flake8 #開発環境用にflake8をインストール
$ pipenv install jupyter notebook # ジュピターのインストール

コマンドの実行

仮想環境での実行方法は以下の二種類あります。
実行する用途に合わせて使い分けて下さい。

shellからコマンドを指定して実行

pipenvのrunコマンドを利用してshellから直接実行することが可能です。
その際は実行したいコマンドをフルで記述して実行する方法と、Pipfileに登録したエイリアスを指定して実行する方法の二種類があります。

$ pipenv run jupyter notebook # コマンドを指定して実行
$ pipenv run jn #Pipfileに登録したエイリアス(今回はjn)で実行

仮想環境に入ってから実行

pipenvのshellコマンドを利用して、仮想環境に移行してからコマンドを実行する方法です。
コマンドライン上で動作チェックする際には便利な方法となります。

仮想環境から抜ける際はexitを指定して下さい。

$ pipenv shell # 仮想環境
bash-3.2$ # 仮想環境に移った
bash-3.2$ python jupyter notebook #仮想環境にてJupyterの実行
bash-3.2$ exit # 仮想環境から抜ける

Pipfileについて

仮想環境のライブラリーの管理はPipfileとPipfile.lockという2つのファイルにて管理されます。
これら2つのファイルは仮想環境のルートディレクトリに自動作成されます。

これらのPipfileをgitなどで配布することによりpipenv installコマンドを介して、全く同一の仮想環境を配布することが可能です。
Pipfileをプロジェクト内で共有することにより開発環境構築の効率化や、ライブラリ差異によるバグを回避することが出来ます。

Pipfile

こちらのファイルにはインストールされたパッケージの概要と仮想環境の定義が指定されます。

パッケージの概要についてはpipenv installコマンドを実行する毎に追記され、特に意識する必要はありません。
仮想環境の定義については[script]セクションを作成することにより設定することが可能です。今回の例ではpipenv runを実行する際のエイリアス指定を定義しています。

以下が現段階でのPipfileです。読みやすくするためコメントを追記していますが、実際にコメントは記載されません。

#仮想環境の基本情報
[[source]] 
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

# 開発環境にのみ適用させるパッケージ
[dev-packages]
flake8 = "*"

# インストール済みのパッケージ
[packages]
jupyter = "*"
notebook = "*"

# 仮想環境の依存関係を定義
[requires]
python_version = "3.7"

# pipenv run実行時のエイリアスを指定(任意で記述)
[scripts]
jn="jupyter notebook"

Pipfile.lock

こちらのファイルではパッケージのバージョンをハッシュで記憶して厳格に管理しています。基本的にこのファイルを編集することは有りません。

{
    "_meta": {
        "hash": {
            "sha256": "40d1c1380b12a62f3235c9b231680e7d000ec365026abbcbf5ab8e9dcae46ce2"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.7"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "appnope": {
        ...
        ...
モバイルバージョンを終了