Python実行環境構築(pyenv + pipenv)

機械学習アルゴリズムの研究をする際に複数バージョンのPythonを切り替えたり、動かすプログラムによってパッケージバージョンを変更したりと管理する手間が結構かかります。理由としては以下のような事が挙げられると思います。

  • Pythonはバージョン2とバージョン3で互換性が無い
  • ライブラリのバージョンアップが頻繁
  • ライブラリ相互の依存関係がある
  • ドライバ等の実行環境に依存するライブラリが存在する

Pythonにはこれらの問題を解決するための便利なツールも用意されています。今回pyenvとpipenvでかなり使いやすい環境が構築できたので記事にまとめておきたいと思います。

実験環境

ubuntu 18.04 LTS
(ディフォルトでpython2とpipがインストールされている事を想定)

手順

  1. pyenvインストール
  2. pipenvインストール
  3. 仮想環境作成とパッケージインストール
  4. 仮想環境への切り替え

pyenvインストール

$ git clone https://github.com/yyuu/pyenv.git $HOME/.pyenv

これによってpyenvの必要環境がユーザーフォームの直下に”.pyenv”というディレクトリ名で作成されます。この中に必要な実行コマンドのファイルがあるのですが、それを実行するために環境変数を変更する必要があります。

個人的には $HOME/.pyenvrcというファイルを作成して、以下を記述しています。

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

その上で、.bashrcや.zshrcなどで以下のように記述して読み込んでいます。

# for pyenv
source $HOME/.pyenvrc

pipenvインストール

$ python -m pip install pipenv

この手順ではpyenvでインストールされるpythonではなく、もともとのpython2環境にpipenvをインストールしています。複数環境の切り替えを行うようになると、どの環境にどのパッケージがインストールされているか見失いがちです。混乱しないようにするためにも、pipenvは初期インストールされているpython環境にインストールするようにしています。

仮想環境作成とパッケージインストール

プログラムを実行する場所でこの操作を行う事で、PipfileとPipfile.lockができます。これらをプログラムと一緒にバージョン管理する事で、グループワークでも環境の共有化が簡単に行えます。

$ python -m pipenv --python バージョン('3.7'など)
$ python -m pipenv install ライブラリ名 ←これを繰り返す

パッケージインストールの時にtensorflowのような大きなパッケージだとLocking…という表示が長時間続くことがありますが、ネットワークトラブルなどがなければ待っていれば終わるはず…です。ただ、結構トラブルに会う人が多いようで、トラブルシュートの記事も多く見られますね。

ちなみにpipenvでインストールすると中々見た目に可愛い感じのアニメーションがされて良いですね。

仮想環境への切り替え

$ python -m pipenv shell

シェルのプロンプト先頭に識別名が追加されて、仮想環境に切り替わった事がわかります。試しに python -V などとするとpyenvでインストールされたバージョンが起動する事が分かります。また pip list とすると、pipenvで構築したパッケージ郡が表示されるはずです。


既に作成されたPipfile、Pipfile.lockがある場合

すでにリポジトリにコミットされているPipfileやPipfile.lockを用いて環境を再構築する場合は、pipenvインストールまでを行ったあとPipfileとPipfile.lockがあるディレクトリ以下を実行するだけで良いです。

$ python -m pipenv install

その後は仮想環境への切り替えを行う事で、環境再現できます。グループワークには非常に便利ですね〜。

Author: kan
初めてプログラムらしきものを作ったのは幼稚園の時。それから約40年経ち、現在はデジタル回路設計から信号処理、機械学習まで幅広い経験を活かしてシステムアーキテクトとして活動中。超並列処理、デジタル回路とソフトウェアのバランス設計が得意分野。 Linux/Mac/Windows使い。 C/C++を主要言語として、Unity、Qtなどのフレームワーク興味あり。UI/UXデザイン、STL拡張など。 音声処理、画像処理、技術コンサルは仕事でも請け負います。 一般ソフトウェア開発プロセス、医療機器ソフトウェア開発プロセス作成も進行中。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください