プロジェクトごとのパッケージ管理はrequirements.txtで行うことが多かったのですが、requirements.txtへの記入が漏れてインストール作業でゴタゴタすることもあるため、最近ではパッケージ管理ができるツールを使用することが多いです。
今回はいくつかあるパッケージ管理ツールの中からPipenvというパッケージ管理ツールを紹介したいと思います。
Pipenvとは
Pipenvはpip + venv + requirementsを組み合わせた、Pythonの外部モジュールの依存関係管理やパッケージングを行うためのツールです。今回はUbuntu18.04の環境にインストールしてみます。
Pipenvのインストール
Pipenvのインストールはpipコマンドで行えます。pipenvは管理者権限でグローバルにインストールしないと動かないので、sudo
をつけて実行しましょう。ローカルユーザへインストールするとPathが通ってなくて、pipenv: command not found
と表示されるてハマります。(ハマりました。)
$ sudo pip install pipenv
実行完了したら下記コマンドでpipenvコマンドがインストールされていることを確認してみましょう。
$ pipenv --version
Pipenvを使う
プロジェクトの初期化
Pipenvではまず、Pipenvで管理するプロジェクトを初期化する必要があります。
管理したいプロジェクトへ移動して、初期化コマンドを実行します。
$ cd <管理したいプロジェクトのPath> $ pipenv --python 3
pipenv --python
で指定するPythonバージョンはpipenv --python 3.6
のように細かく指定することも可能です。
初期化を行うのと、カレントディレクトリにPipfileというpipenvでの構成管理ファイルが生成されます。
$ ls
Pipfile
Pipfileには構成情報が記載されています。
[[source]] name = "pypi" url = "https://pypi.org/simple" verify_ssl = true [dev-packages] [packages] [requires] python_version = "3.6"
Pythonパッケージの追加
初期化したプロジェクトでPythonパッケージを追加する場合は以下のコマンドで実行します。
$ pipenv install <インストールしたいPythonパッケージ>
例えば、requests
パッケージをインストールしたい場合は下記のように実行します。
$ pipenv install requests
実行するとインストールが始まります。
インストール完了後Pipfile.lockというファイルが自動生成されます。
$ ls
Pipfile Pipfile.lock
Pipfile.lockにはインストールされた詳細なバージョンや依存パッケージの情報が記録されています。
{ "_meta": { "hash": { "sha256": "8739d581819011fea34feca8cc077062d6bdfee39c7b37a8ed48c5e0a8b14837" }, "pipfile-spec": 6, "requires": { "python_version": "3.6" }, "sources": [ { "name": "pypi", "url": "https://pypi.org/simple", "verify_ssl": true } ] }, "default": { "certifi": { "hashes": [ "sha256:1d987a998c75633c40847cc966fcf5904906c920a7f17ef374f5aa4282abd304", "sha256:51fcb31174be6e6664c5f69e3e1691a2d72a1a12e90f872cbdb1567eb47b6519" ], "version": "==2020.4.5.1" }, "chardet": { "hashes": [ "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" ], "version": "==3.0.4" }, "idna": { "hashes": [ "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb", "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9" }, "requests": { "hashes": [ "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee", "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6" ], "index": "pypi", "version": "==2.23.0" }, "urllib3": { "hashes": [ "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527", "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", "version": "==1.25.9" } }, "develop": {} }
Pipfileを確認すると[packages]
に先ほどインストールしたrequestsが追加されていることが確認できます。
[[source]] name = "pypi" url = "https://pypi.org/simple" verify_ssl = true [dev-packages] [packages] requests = "*" [requires] python_version = "3.6"
バージョンを指定してPythonパッケージを追加する
バージョンを指定してインストールすることもできます。requestsは執筆日現在の最新バージョンは2.23.0ですが、例えば2.20.0をインストールしたい場合、は下記の通りに指定します。
$ pipenv install requests==2.20.0
Pipfileを確認すると[packages]
に先ほどインストールしたrequestsがバージョン2.20.0で追加されていることが確認できます。
$ cat Pipfile [[source]] name = "pypi" url = "https://pypi.org/simple" verify_ssl = true [dev-packages] [packages] requests = "==2.20.0" [requires] python_version = "3.6"
Gitリポジトリを指定してインストールを行うこともできます。
$ pipenv install git+https://github.com/<ユーザ>/<リポジトリ>.git@<リビジョン>#egg=<パッケージ名>
追加したパッケージを削除する
追加されているパッケージはコマンドで削除することができます。
先ほど追加したrequestsを削除してみます。
$ pipenv uninstall requests
削除ができたか、Pipfileを確認します。
[[source]] name = "pypi" url = "https://pypi.org/simple" verify_ssl = true [dev-packages] [packages] [requires] python_version = "3.6"
[packages]
から削除されていることが確認できました。
開発環境用にパッケージを追加する
実際のリリースには追加したくないが、開発環境でのみ使いたいパッケージもあるかと思います。例えばautopep8やflake8などです。開発環境用にインストールする場合はpipenv install --dev
のように--devを追加する。
$ pipenv install --dev autopep8 flake8
Pipfileには下記の通り、[packages]
ではなく[dev-packages]
に追加されていることが確認できると思います。
[[source]] name = "pypi" url = "https://pypi.org/simple" verify_ssl = true [dev-packages] autopep8 = "*" flake8 = "*" [packages] [requires] python_version = "3.6"
requirements.txtからのインストール
requirements.txtで管理されているパッケージもPipenvを使用してインストールすることができます。
$ pipenv install -r requirements.txt
Pipfileから環境を再現する
既にパッケージ管理されているPipfileがカレントディレクトリに存在する場合、下記コマンドで環境を再現することができます。
$ ls
Pipfile
$ pipenv install
Pipenvで管理している仮想環境でプログラムを実行する。
下記コマンドを使うとPipenvで管理している仮想環境を使ってプログラムを実行できます。
$ pipenv run python3 hogehoge.py
上記の場合は仮想環境の外から実行するコマンドとなっていますが、仮想環境内に入ってからプログラムを実行することもできます。
$ pipenv shell $ python hogehoge.py
任意のコマンドを設定して実行する。
PipenvではPipfileに[scripts]
というカテゴリを追加すると、独自のコマンドを設定して実行することができます。書き方は[呼び出しコマンド] = "[省略したいコマンド]"
です。あまり好ましい使い方ではないですが、例えばLinuxのdate
コマンドで日付を確認できるようにしてみます。
[scripts] date = "date"
実行するときは[scripts]
に指定した[呼び出しコマンド]
をpipenv run
の引数で指定してあげれば実行できます。上記の設定の場合は
$ pipenv run date
とすると、Linuxコマンドのdateが呼び出されます。私がよく使う使い方だと、
[scripts] test = "pytest"
としておいて、開発中に単体テストを行う時に
$ pipenv run test
として、pytestを呼び出すようにしています。
仮想環境の中からコマンド実行を行うので、通常の実行より遅いかもしれないですが、ショートカット的に使うには結構便利だと思います。