Pythonで、Pipenvを使う

Python - サードパーティ製ライブラリ
2018年11月19日2:44に更新(約9時間前)
2018年11月7日0:00に作成(約12日前)

旧ブログ移行記事です。

Pipenvとは

Pipenvは、Python公式が正式に推薦するPythonパッケージングツールで、簡単に仮想環境の作成等ができるツールです。 pipvenv(virtualenv)が連動して動くようになり、色々と使いやすくなっています。

インストール

pipで簡単にインストールできます。

pip install pipenv

各種リンク

公式
公式ドキュメント日本語訳
Github

Pipfileの作成

helloworldというディレクト(プロジェクト)があり、その中で何かを開発したいとしましょう。

プロジェクトの中に入り、以下のコマンドを入力します。

pipenv install --python 3.6

まだPipfileがない場所でinstallとすると、PipfilePipfile.lockという2つのファイルが作られます。

この2ファイルは、requirements.txtを更に便利に、強力にしたものと考えるのがわかりやすいでしょう。

※元々のrequirements.txtの問題点はこちらを見てください。

Pipfileをのぞくと、以下のようになっています。--python 3.6 とつけたので、requires3.6とありますね。

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]

[requires]
python_version = "3.6"

2つのファイル以外に、仮想環境も自動で作成されています。pipenv --venvとすると、仮想環境のパスが表示されます。以下は、Ubuntuの場合のパスです。

narito@narito:~/helloworld$ pipenv --venv
/home/narito/.local/share/virtualenvs/helloworld-koUQ8J54

Windowsだと、こんなパスになっていました。

PS C:\Users\torit\src\python\django\helloworld> pipenv --venv
C:\Users\torit\.virtualenvs\helloworld-oCCfNi4K

目立たない場所に作ってくれるのも魅力ですね。 仮想環境のディレクトリ名(helloworld-koUQ8J54)は、プロジェクト...開発しているディレクトリ名(helloworld)に対応して作られます。 プロジェクト内でpipenv関連コマンドを使うと、その名前の仮想環境が既にあるかを確認し、なければ作る、という流れですね。

何かライブラリをインストールしてみましょう。インストールするには、pipenv install ライブラリ名 とします。

pipenv install requests

イメージとしては、requirements.txtが自動で更新される感じになります。 まず、Pipfileが変更されます。[packages]requestsが追加されました。

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requests = "*"

[dev-packages]

[requires]
python_version = "3.6"

Pipfile.lockは、ハッシュを使ったセキュリティのチェックや、実際の依存ライブラリ(requestsならcertifi等にも依存するのでその情報)等が表示されています。

{
    "_meta": {
        "hash": {
            "sha256": "33a0ec7c8e3bae6f62dd618f847de92ece20e2bd4efb496927e2524b9c7b8df8"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.6"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.python.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "certifi": {
            "hashes": [
                "sha256:14131608ad2fd56836d33a71ee60fa1c82bc9d2c8d98b7bdbc631fe1b3cd1296",
                "sha256:edbc3f203427eef571f79a7692bb160a2b0f7ccaa31953e99bd17e307cf63f7d"
            ],
            "version": "==2018.1.18"
        },
        "chardet": {
            "hashes": [
                "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
                "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
            ],
            "version": "==3.0.4"
        },
        "idna": {
            "hashes": [
                "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f",
                "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4"
            ],
            "version": "==2.6"
        },
        "requests": {
            "hashes": [
                "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b",
                "sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"
            ],
            "index": "pypi",
            "version": "==2.18.4"
        },
        "urllib3": {
            "hashes": [
                "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b",
                "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f"
            ],
            "version": "==1.22"
        }
    },
    "develop": {}
}

もちろん、仮想環境内には実際にライブラリがインストールされています。 pipenv run pip freezeとすることで、現在の仮想環境内にあるライブラリを確認することができます。

narito@narito:~/helloworld$ pipenv run pip freeze
certifi==2018.1.18
chardet==3.0.4
idna==2.6
requests==2.18.4
urllib3==1.22

Pipfileからのインストール

既にPipfileがある場合は、pipenv installとするだけで環境が再現できます。なので、Pipfileがあってもなくても、基本的にはpipenv installとしておけば間違いありません。

pipenv install

既にあるPipfileを元に、Pythonのバージョンを別にして試したい場合はpipenv install --python 3.5 のようにします。

pipenv install --python 3.5

PipfileのPythonバージョンと違う場合は教えてくれます。親切ですね。

Warning: Your Pipfile requires python_version 3.6, but you are using 3.5.3

pyenvをインストール済みで、PipfileがrequiresしているPythonバージョンがシステムになかった場合は、それを自動でインストールするか訪ねてくれたりもするようです。

プログラムの実行

python main.py のようなファイルの実行方法についてです。 pipenv shellで、仮想環境が有効化された状態で操作ができるようになります(source bin/activateScripts\activate された状態)

なので、この後にpython main.py のように実行ができます。 ユーザー名の横に、仮想環境名がつけられています。抜けたくなったら、exitです(場合によっては、activateコマンドを利用することになります)。

narito@narito:~/helloworld$ pipenv shell
(helloworld-koUQ8J54) narito@narito:~/helloworld$ python main.py
(helloworld-koUQ8J54) narito@narito:~/helloworld$ exit
narito@narito:~/helloworld$ 

上で既に軽く触れましたが、一回限りのコマンドなんかは、pipenv run を使うと便利です。

pipenv run python main.py

仮想環境のリセット

pipenv uninstall ライブラリ名 で、そのライブラリをアンインストールできます。PipfilePipfile.lockにも直ぐに反映されますが、仮想環境内には他の依存ライブラリが残ってしまうようです。requestsをuninstallしてみると、requestsは消えますが、requestsに依存していたライブラリは残っています。

narito@narito:~/helloworld$ pipenv uninstall requests
...
...
narito@narito:~/helloworld$ pipenv run pip freeze
certifi==2018.1.18
chardet==3.0.4
idna==2.6
urllib3==1.22

これを繰り返して仮想環境内がごちゃごちゃしてきたら、綺麗にしたいと思うはずです。 単純に仮想環境を空にしたいならば、pipenv --rm ができます。これは仮想環境そのものの削除です。

narito@narito:~/helloworld$ pipenv --rm
Removing virtualenv (/home/narito/.local/share/virtualenvs/helloworld-koUQ8J54)…

または、pipenv uninstall --all でもできます。仮想環境自体は残っている状態です。--allをつけた場合は、Pipfileの内容を変えません。

narito@narito:~/helloworld$ pipenv uninstall --all

個人的に楽だなーと思った方法は、pipenv install --python 3.6 のようにPythonのバージョン名まで含めて書くと、仮想環境を作り直してPipfileの内容でインストールもしてくれます。

pipenv install だけだと既に必要なライブラリがある場合は何もしないのですが、--python 3.6 のようにオプションをつけると一度仮想環境を破棄するので、仮想環境の破棄とライブラリのインストールを同時に行う訳ですね。

narito@narito:~/helloworld$ pipenv install --python 3.6
Virtualenv already exists!
Removing existing virtualenv…
Creating a virtualenv for this project…

記事にコメントする