これはNTTドコモ R&D Advent Calendar 2020の18日目の記事です。
はじめに
こんにちは。ドコモ社員の石川です。
僕はいつもデータ分析とかをしていて、特に機械学習とかでPythonをよくいじったりしているんですが、気がついたら使用していた仮想環境がごちゃごちゃになっていたのでこれを機会に一度整理してみようと思いました。
ちなみに整理する前の僕の環境は、まずpyenvが導入されていて、その1つの仮想環境にanaconda3.6を立ててある感じで、つまり仮想環境の中に仮想環境が入っていてる感じですね。
しかも特に環境を切り替えることもあまりなく、このように入り組んだ構築をしたにもかかわらず全くその意味を成していない状態でした。
まあ特に問題なく動いてくれているのでこのままでも良いかな〜とも思っていたのですが、「もしかして無駄に動作が重くなってる?」「新しいPythonバージョン使いたいけど環境新しく立てるのめんどいな?」と思ったのをきっかけに整理してみようと思いました。
そこで今回はいろいろある仮想環境を実際に試してみて、それぞれどんな特徴があったのかまとめてみようと思います。
みなさんのより良いPython開発環境の構築に参考になれればと思います。
なお、本記事中の実行環境はDocker上で動作しているUbuntu:20.04になります。
文中の実行コマンドを参考にされる際は適宜sudo
で実行してください。
また記事の最後に「こういう人にはこの環境がおすすめ」というのをまとめたので、そちらを先にご覧になっても良いかなとも思います。
今回はこちらの記事「pyenv、pyenv-virtualenv、venv、Anaconda、Pipenv。私はPipenvを使う。」を参考にさせていただきました。
仮想環境の種類
今回試したのは下の7種類です。
- pyenv
- virtualenv
- pyenv-virtualenv
- venv
- Anaconda
- 素のPython
- Pipenv
pyenv
pyenvでできることは、
- 各Pythonバージョンのインストール
- Pythonのバージョンの切り替え
- 特定のディレクトリ配下で利用するバージョンの自動切り替え
とのことです。
apt install -y \
build-essential \
libffi-dev \
libssl-dev \
zlib1g-dev \
liblzma-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
git \
wget
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
pyenv install --list
pyenv install 3.9.0
pyenv global 3.9.0
python
pip install numpy
参考:ubuntu 20.04 / 18.04 に pyenv をインストールする話
pyenvの所感
長所
- 非常にシンプル。
- 新しいバージョンのPythonを簡単にインストール、切り替えができる。
- pipの導入も勝手にやってくれるので簡単にPythonを導入できる。
短所
-
.bashrc
を書き換えてまでいるのにそこまで機能がないので人によっては好き嫌いあるかも。 - 同一のPythonバージョン内でパッケージ環境の分離、切り替えができない。
virtualenv
virtualenvでできることは、
- Pythonのバージョンとパッケージ環境の切り替え
になります。Python自体のインストールは別途必要になります。
apt install virtualenv
# 任意の場所に'test_env'の名前で環境の保存場所を作成
mkdir ~/test_env
# 仮想環境の保存場所として指定
virtualenv ~/test_env # この場合マシンのデフォルトのPythonバージョンが使われる
virtualenv -p /usr/bin/python3.9 ~/test_env # バージョンを指定したいときはインストール済みのものをこんな感じで指定する
. ~/test_env/bin/activate
python
pip install numpy
deactivate
rm ~/test_env -r
参考:Virtualenvインストールとセッティングする方法(Ubuntu)
virtualenvの所感
長所
- 同一のPythonバージョン内でパッケージ環境の切り替えができる。
- 他のパッケージ管理ができるものと比べて気持ち軽量
短所
- virtualenvを使って新しくPythonをインストールできない。
- 仮想環境の起動、停止、切り替えでいちいちコマンドを打たなければならないので面倒。
pyenv-virtualenv
そもそもpyenv-virtualenvは、pyenvのプラグインだそうです。
機能としてはpyenvのものに加えて
- Pythonのバージョンとパッケージ環境の切り替え
- 特定のディレクトリ配下で利用するPythonのバージョンとパッケージ環境の自動切り替え
とのことです。
# pyenvがインストール済みの状態で
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
eval "$(pyenv virtualenv-init -)" >> ~/.bashrc
source ~/.bashrc
# Python3.9.0で'test_env'の名前で環境を作成(pyenvでPython3.9.0をあらかじめインストール済み)
pyenv virtualenv 3.9.0 test_env
pyenv global test_env
python
pip install numpy
source deactivate
pyenv uninstall test_env
参考:Ubuntuへのpyenv-virtualenvのインストールと使い方をまとめておく。他のディストリビューションでもいけると思う
pyenv-virtualenvの所感
長所
- 新しいバージョンのPythonを簡単にインストールができてる。
- 同一のPythonバージョン内でパッケージ環境の切り替えができる。
- 仮想環境の作成がシンプル。
- 仮想環境の起動、停止、切り替えでいちいちコマンドを打たなければならないが、pyenv同様に特定のディレクトリに特定の仮想環境を割り当てて自動切り替えさせることができる。
短所
- 全てのコマンドを実行する際に後ろで1回1回環境チェックが走るので動作が重くなる。
-
.bashrc
を結構書き換える必要あり。
venv
venvの特徴は、virtualenvとほぼ同じでした。
ただ、各Pythonバージョンをインストールする方法がそもそもvenvをインストールするのと同義なのでよりシンプルな感じです。
# 今回は3.9で仮想環境を作ります。
apt install python3.9-venv python3-pip
# 'test_env'の名前で環境を作成
python3.9 -m venv ~/test_env
source ~/test_env/bin/activate
python
pip install numpy
deactivate
rm ~/test_env -r
参考:UbuntuにPython3.8とvenvの仮想環境をインストールする
venvの所感
- virtualenvとほぼ同じ。
- 公式が提供しているものなので安心して使える。
Anaconda
Anacondaでできることは、
- 各Pythonのバージョンのインストール
- パッケージ環境の管理
- パッケージのインストール(
pip
の代わりにconda
コマンドでできる)
とのことです。
cd ~
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod 777 Miniconda3-latest-Linux-x86_64.sh
~/Miniconda3-latest-Linux-x86_64.sh
source ~/.bashrc
# Python3.8.0で’test_env’の名前で仮想環境を作成
conda create -n test_env python=3.8.0
conda activate test_env
python
# condaコマンドでできる。
# pipコマンドでもできるが衝突しないようにどちらかに統一して使った方が良さそう。
conda install numpy
conda deactivate
conda remove -n test_env --all
参考:minicondaのインストールと仮想環境の複製・インポート
Anacondaの所感
長所
- Pythonのインストール、パッケージ環境管理、パッケージのインストール全部やってくれて初心者に優しい。
- Anacondaが全部請け負ってくれるので管理が楽。
短所
- ホームディレクトリにいろいろ保存される。
- 仮想環境の起動、停止、切り替えでいちいちコマンドを打たなければならないので面倒。
-
conda
コマンドが重く感じる。 - 一部利用制限あり
素のPython
ここで言う"素のPython"とは、
-
apt install
で各Pythonバージョンをインストールする - パッケージ環境の管理はしない
- Pythonのバージョンは実行時にコマンドで指定する
という非常に原始的な方法です。
apt install python3.9
apt install python3-pip
pip3 install -U pip
python3.9
python3.9 -m pip install numpy
素のPythonの所感
長所
- インストールするものが最小限。最も軽量。
短所
- インストールがやや複雑
- もちろんパッケージ環境の管理はできない。
- 実行コマンドや、pipコマンドが複雑。ただし、下記のようにaliasを指定しておけば他のと同じように
python
やpip
コマンドで実行できるようになる。
echo "alias python=\"python3.9\"" >> ~/.bashrc
echo "alias pip=\"python3.9 -m pip\"" >> ~/.bashrc
source ~/.bashrc
Pipenv
Pipenvとは、
- Python自体とは独立していて、もちろんPythonのインストール機能はない
-
pip
の代わりにパッケージのインストールができて、同時にパッケージ環境の管理までする
というものです。
apt install python3-pip python3-distutils python3-dev
pip3 install --upgrade setuptools
pip3 install pipenv
echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc
source ~/.bashrc
# aptでPython3.9をインストールし、’~/test_env'にPython3.9の仮想環境を作成
apt install python3.9
mkdir ~/test_env
cd ~/test_env
pipenv --python 3.9
# pyenvをインストールしておくと、このときに未インストールのバージョンの場合インストールも一緒にしてくれるそうです。
pipenv install numpy
pipenv shell
pipenv install numpy
# または
pip install numpy
python
exit
pipenv --rm
参考:【Ubuntu 18.04】pyenv+pipenvでPython環境構築、Ubuntu 20.04にpipenvとmoviepyをインストールする
Pipenvの所感
長所
- 仮想環境ごとにインストールしてあるパッケージとそのバージョンの一覧が簡単にわかる。
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
numpy = "*"
[dev-packages]
[requires]
python_version = "3.9"
短所
-
pipenv install
コマンドが重い。 - 仮想環境の作成、起動、停止が面倒。
総評(こんな人はこの仮想環境使おう)
今回7種類の仮想環境を試してきましたが、実際に使ってみてこう言う人向けにはこれが向いているな?と思ったものをまとめてみました。
これから環境構築する人や、見直したい人にご参考にしていただければと思います。
-
パッケージ管理の必要がなく滅多にPythonのバージョンも変えない、apt等を用いたインストールに慣れている。
- 素のPython
-
パッケージ管理の必要がないがPython バージョンは切り替えたい 、新しくしていきたい。とにかく手っ取り早くシンプルかつ簡単にPython環境構築したい。
- pyenv
-
パッケージ管理が必要で、面倒くさくない切り替えがしたい
- pyenv + pyenv-virtualenv
-
パッケージ管理が必要で、コマンドが重くなるのは嫌だ
- venv
-
共同でコーディングしていてみんながPipenv使っている、またはパッケージ管理をスマートにしたい
- pyenv + Pipenv
-
上記以外、またはPython周りを全部まとめてよろしくして欲しい
- Anaconda
反省と戒め
ここからは余談ですが、今回の執筆を経て学んだことを書いておきます。
今回の調査をしていて途中で思ったことがありまして、「そもそも僕、Dokcer使ってるんだからPythonの仮想環境いらないじゃん」です。pyenvやAnacondaを使う必要がないのにコンテナの中にゴリゴリにインストールだけしていた感じですね。pyenvやAnacondaにはそれぞれ特有の素晴らしい機能や良さがあるにも関わらず、それらを全く使わずに動作だけを遅くしていたと言う渋い状況でした。
みなさんもPython環境に限らず自分がいつも使っているもの、自分がおかれている環境の特性をよく理解しながら仕事や研究をしていますか?一度立ち止まってそれらと改めて正面から向き合い、それらの持っている本来の特性を捉えることでみなさんのパフォーマンスを最大限に発揮できるようになるかもしれません。
この記事によって一人でも多くの人の仕事や研究での活動、Python環境がより良くなることを願っています。