【Python】環境構築の個人的ベストプラクティス – pyenvとpipenv

python-logo Python

Pythonは2系と3系で大きく仕様が異なり、
環境構築を意識して行わないと、プログラムが動かないことがある。

世間的には2系は既にサポートを終了している。
とは言え、やむをえず2系を触らなければいけない状況があったりする。

また、同じ3系のバージョンでも
チーム内で利用する言語のバージョンは合わせておくのがベストである。

ということで、
今回は私の個人的な環境構築のベストプラクティスを紹介する。

まずはバージョンの確認方法

PCにインストールされているPythonのバージョン確認方法は以下の通り。

$ python --version
Python 2.7.16

私のPCにインストールされているバージョンは2.7.16ということが分かる。

今回使う技術

今回使う技術はpyenvpipenvの2つである。

pyenv

pyenvは、PC内で利用するPythonのバージョンを管理する。

PC全体で利用するPythonのバージョンを切り替えたり、
「ディレクトリA配下で利用するバージョンは2系で、
ディレクトリB配下で利用するバージョンは3系」
というように、ディレクトリ単位でバージョンを管理することができる。

インストールされていれば良い。

pipenv

Pythonはいろいろなライブラリをインストールし、
それを駆使してプログラムを作成することがほとんどである。

pipenvは、主にそのライブラリ管理のために利用する。

JavaScriptではnpm、PHPではcomposerに相当する。

pyenvとpipenvの役割分担

  • pyenv:Pythonのバージョンを管理する
  • pipenv:利用するライブラリ一覧を管理する

プロジェクトの作成

今回、それぞれのインストール方法は割愛する。

以下のコマンドでプロジェクトの作成を行う。
このとき利用するPythonのバージョンを指定する。

$ pipenv --python 3.7

すると、Pipfileというファイルが作成される。
この後にライブラリなどをインストールすると、
その情報がこのファイルに記録されていく。

$ ls
Pipfile
$ cat Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]

[requires]
python_version = "3.7"

エラーが出た場合

このとき、以下のようなエラーが出た場合は、
今使っているPythonのバージョンを3.7.3にする必要がある。

$ pipenv --python 3.7
pyenv: pipenv: command not found

The `pipenv' command exists in these Python versions:
  3.7.3

以下の手順でPythonのバージョン確認とバージョン設定を行う。

# Pythonのバージョンを確認すると、3.7ではないことが分かる
$ python --version
Python 2.7.16

# pyenvを使ってそのディレクトリで利用するPythonのバージョンを設定する
$ pyenv local 3.7.3

# .python-versionというファイルが作成され、そこにバージョン情報が記録される
$ ls -la .python-version
-rw-r--r--   1 username  staff     6B  8  1 11:18 .python-version

# Pythonのバージョンを確認すると、3.7.3になっていることが確認できる
$ python --version
Python 3.7.3

ここまででプロジェクトの作成は完了である。

ライブラリのインストール

os,pprint,jsonなどの標準ライブラリはimport文を記載するだけで問題ないが、
pandas,Numpyなどの外部ライブラリを利用するときは別途インストール作業が必要になる。

ライブラリのインストール方法は2種類存在する。

  1. PC全体にインストールする方法
  2. プロジェクトごとそれぞれにインストールする方法

今回は「プロジェクトごとにそれぞれインストールする方法」を行う。

pipenvを使うことによってこれが可能となり、
同じライブラリでもプロジェクトごとに異なるバージョンを利用できたり、
PC本体にインストールするわけではないので、他の人と共同開発するとき
「人によって使えないライブラリがある」といったことを防ぐことができる。

新しくライブラリを追加する場合

pandasライブラリをプロジェクト内にインストールする場合、次のように行う。

$ pipenv install pandas

すると、Pipfileにpandasのライブラリ情報が記録される。

[[source]]
// 省略

[dev-packages]
// 省略

[packages]
pandas = "*"

[requires]
// 省略

追加されたライブラリは「パッケージ名 = “バージョン”」という形式で記録される。
今回は特にバージョンを指定していないため、*(バージョンはなんでもよい)という記載になっている。

開発時だけ利用するライブラリを追加する場合

構文チェックを行うライブラリなどは、開発時は必要だが運用時には必要ないライブラリである。

このような「開発時だけあればよいライブラリ」は
下記のようにインストールすることで区別して扱うことができる。

例えば、pylintというコードチェックツールをインストールするとき、
下記のように--devオプションを付与してインストールを行う。

$ pipenv install pylint --dev

すると、Pipfileでもdev-packagesとして記録される。

[[source]]
// 省略

[dev-packages]
pylint = "*"

[packages]
pandas = "*"

[requires]
// 省略

既に作成済みのプロジェクトの場合

他の誰かがプロジェクトを既に作成していて
Pipfileにライブラリ情報が既に記載されている場合は、
以下のコマンドで必要なライブラリを一括インストールすることができる。

$ pipenv install

開発時のみ利用するライブラリ(--devを使ってインストールしたもの)
も含めてインストールしたい場合は、--devオプションを利用するだけでよい。

$ pipenv install --dev

既に作成されているプロジェクトでは、このコマンドを実行すれば
必要な環境構築は一気に終わる。

実行する

今回はmain.pyを実行したい状況とする。

$ ls
Pipfile main.py

また、分かりやすいように、

  • PCにインストールされているPythonのバージョン:2.7.16
  • プロジェクト内で使われているPythonのバージョン:3.8.5

とする。

$ python --version
Python 2.7.16

$ cat Pipfile
# 省略
[requires]
python_version = "3.8"
# 省略

pipenvによるスクリプトの実行方法は2通り存在する。

  1. pipenvで作成される仮想環境に入って、pythonコマンドからスクリプトを実行する
  2. Pipfileに実行用スクリプトを記載して、pipenv run コマンド名で実行する

pipenvで作成される仮想環境に入って実行

pipenv shellコマンドで、pipenvが作成する仮想環境に入ることができる。

仮想環境内でpython --versionコマンドを使うと、pipenvによって指定されたバージョンを利用することが確認できる。

# PCにインストールされているPythonのバージョン確認
$ python --version
Python 2.7.16

# 仮想環境に入る
$ pipenv shell
Launching subshell in virtual environment…
(current_dir_name)$
# ↑現在のディレクトリ名が表示されているはず

# 仮想環境内でPythonのバージョンを確認する
(current_dir_name)$ python --version
Python 3.8.5

# スクリプトを実行する(3系のPythonで実行される)
(current_dir_name)$ python main.py
Hello, World!

# exitで仮想環境から抜ける
(current_dir_name)$ exit
$

実行用スクリプトを作成して、pipenvコマンドから実行する

上記のように、PCにインストールされていない3系のPythonでスクリプトを実行したい場合、
仮想環境内のPythonコマンドから実行しなくてはいけない。

また、pipenvによってインストールされたライブラリは
仮想環境内でしか使うことができない。

下記ようにPipfile内に[scripts]を「実行キーワード=仮想環境内で実行するコマンド」
の形式で記載すればOK。

Pipfile

[[source]]
// 省略

[requires]
python_version = "3.8"

[scripts]
dev = "python main.py"

このように記載しておくとpipenv run 実行キーワードで実行可能になる。

$ pipenv run dev
Hello, World!

npmを使ったことがある人ならば、同じ要領なので理解しやすいと思う。

まとめ

  • プロジェクト内のPythonバージョンやライブラリ管理はpipenvで行う
  • pyenvpipenv内で利用されているが、あまり意識しなくて良い
  • Pipfileに実行用スクリプトを書いておくと、pipenv run 実行キーワードで実行できる
タイトルとURLをコピーしました