いつでもティータイム

ここはハートが目覚めて花咲いてリスペクトしあう場所

Python における環境構築

Python における環境構築

Pyenv + Pipenv で Python の仮想環境を構築した際の備忘録。

Python の環境構築については既に様々な人が解説してくれています。 それを参考に、ド素人な自分用にちょいちょいメモを追加。

Pyenv

Python 自体のバージョン管理に使用する。

インストール

$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv

設定

shell の設定ファイルに以下を追加。 自分は ~/.zshenv に記述した。

# for pyenv
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"

Python のインストール

Pyenv を利用して指定のバージョンの Python をインストールする。

$ pyenv install 3.6.5
$ pyenv rehash

新しいバージョンの Python をインストールした場合、pyenv rehash を実行して shims コマンドを更新する。

ちなみに shims コマンドは、使用するバージョンにおける pythonpip などのコマンドで ~/.pyenv/shims 以下に配置されている。

使用する Python の指定

以下のコマンドで基本的に使用される Python のバージョンを指定できる。

$ pyenv global 3.6.5

なお、そのディレクトリのみといったように局所的に使用したい場合は次のように指定する。

$ pyenv local 3.6.5

pyenv local でローカルに Python のバージョンを指定した場合、実行したディレクトリに .python-version が作成される。

Python の削除

もし特定のバージョンの Python をアンインストールしたい場合には以下のようにする。

$ pyenv uninstall 3.6.5

Pipenv

仮想環境の管理およびパッケージ管理の両方を行うために使用する。

pipenv のインストール

pip でインストールする。

$ pip install pipenv

pip で入れるものを管理するための Pipenv を pip で入れるという何とも不思議な感覚。

仮想環境の構築とパッケージのインストール

Python で開発を行う場合には、プロジェクトごとに仮想環境を作成するのが一般的らしい。 プロジェクトのディレクトリで以下を実行。

$ pipenv install
$ ls
>> Pipfile Pipfile.lock

できたてホヤホヤのまっさらなディレクトリであった場合、PipfilePipfile.lock が作成されているはずである。

Pipenv は Pipfile と Pipfile.lock というファイルによって仮想環境およびパッケージを管理している。 既に Pipfile, Pipfile.lock が存在している状態で pipenv install を実行した場合、Pipfile 内の dev-dependencies に記述されている部分を除いたパッケージのインストールされた仮想環境を構築する。 したがって、プロジェクトを公開する場合には Pipfile, Pipfile.lock を含めておけば利用者は必要な環境を容易に再構築することができる。

新しいパッケージを追加する場合には以下のように追加する。

$ pipenv install numpy
$ pipenv install --dev autopep8

1行目には Numpy というパッケージを追加する例を示した。 パッケージをインストールすると Pipfile, Pipfile.lock が自動的に更新される。

2行目には開発用パッケージとして autopep8 を追加する例を示した。 開発用パッケージとして追加した場合、Pipfile, Pipfile.lock からの pipenv install でインストールされるパッケージに含まれなくなる。 コード整形やデバッグのためだけに使うパッケージであれば開発用で追加するのが良い。 もし、開発用パッケージも含めて再構築したい場合には pipenv install --dev とする。

仮想環境のアクティベート

pipenv run により、仮想環境をアクティベートした Python を実行可能である。

# hoge.py
import numpy as np

a = np.arange(9).reshape(3, 3)
print(a)
$ pipenv run python hoge.py
>> [[0 1 2]
>>  [3 4 5]
>>  [6 7 8]]

インストールした Numpy が利用可能であることがわかる。

ちなみに、構築した環境を使用しない場合は Numpy がインストールされていないため動作しない。

$ python hoge.py
>> Traceback (most recent call last):
>>   File "hoge.py", line 1, in <module>
>>     import numpy as np
>> ModuleNotFoundError: No module named 'numpy'

また、pipenv shell を使用すれば、仮想環境をアクティベートした shell が起動される。

$ pipenv shell
>> Spawning environment shell (/bin/zsh). Use 'exit' to leave.
>> . ~/.local/share/virtualenvs/projects-idXXXX/bin/activate

また、この shell 内での pip install hoge は、pipenv install hoge と同じである(多分)。 pip install hoge の結果も Pipfile, Pipfile.lock に反映される。

余談

上述したように、Python で開発を行う場合にはプロジェクトごとに仮想環境を作成するのが一般的らしい。 しかし、Python を普段使いしてると conda みたいにグローバルに利用できる仮想環境が使いたい場合もまあまあある。

そういう時はどうすればいいんだろう? PipfilePipfile.lock だけを管理するディレクトリを作って、必要に応じて pipenv shell でアクティベートとか?