venv+pipでポータブルな環境を構築する


はじめに

  • Pythonのプロジェクトはある意味環境そのものなので、普通にシステムにpipで入れまくっていると、移植するときに何が必要かわからなくなって大変。
  • そこで、Python標準で用意されているvenvとpipを使って、仮想環境を作りましょう。

記事の流れ

実際にプロジェクトを作る。その時にvenvを使って環境をシステムから切り離しておく。

次に実際に別の仮想環境へ移植してみる。

venvで仮想環境を作る

venvとは

venvはPython標準の仮想環境。

PythonにはほかにもVirtualenvやらpyenvやらいろいろあるが、venvは公式が推しているという点で強い。

仮想環境構築

まず適当にプロジェクトのディレクトリを作る。ここではproject1とでもしておく。

次にproject1へ入り、次のコマンドを実行する。

python -m venv test_env

ここでtest_envは好きな名前にする。うまくいくとproject1/test_envというディレクトリができる。

仮想環境に入る

このとき仮想環境は作られるが、まだ有効になっていないので有効化する。シェルセッションを立ち上げて最初は必ず入る必要がある(そうしなければシステムの環境がそのまま使われる)。

test_envの中にあるScriptに仮想環境を有効化するコードがある。

# bash
Scripts/acrivate

# windows(コマンドプロンプト)
.\Scripts\activate.bat

# windows(Powershell)
.\Scripts\Activate.ps1

Powershellの場合、デフォルトではExecution-Policyでブロックされるので、適切に変更する。

うまく有効化されると、プロンプトが下記のようになる。

(test_env) user@host:/path/to/project1 $ 

環境をいじっていく

といってもpipが使える。pipでガシガシ入れていく。たとえばtensorflowの1.13.11を入れてみる。ちなみにGPU版のtensorflow-gpuも特に問題なく入れることができる。

pip install tensorflow==1.13.1

そのあと、pip listしてみると、下記のようにインストールされたライブラリが表示される。

pip listの結果
Package              Version
-------------------- -------
absl-py              0.8.1
astor                0.8.0
gast                 0.3.2
grpcio               1.24.3
h5py                 2.10.0
Keras-Applications   1.0.8
Keras-Preprocessing  1.1.0
Markdown             3.1.1
mock                 3.0.5
numpy                1.17.3
pip                  19.3.1
protobuf             3.10.0
setuptools           39.0.1
six                  1.12.0
tensorboard          1.13.1
tensorflow           1.13.1
tensorflow-estimator 1.13.0
termcolor            1.1.0
Werkzeug             0.16.0
wheel                0.33.6

仮想環境から出る

シェルに応じて、Scripts以下のdeactivateという名前のスクリプトを実行する。

Powershellの場合、単に「deactivate」と唱えるだけでよい。

環境を移植する

ここから、仮想環境の真骨頂である移植に入る。

requirements.txtの作成

移植元の環境で次のコマンドを唱える。

pip freeze > requirements.txt

やっていることは単純で、インストールされたライブラリとバージョンの一覧をpip freezeで出力し、それをパイプでrequirements.txtに書き込んでいるだけである2。pip freezeとpip listの違いは下記。
https://note.nkmk.me/python-pip-list-freeze/

requirements.txtからインストール

新しい環境へrequirements.txtをコピーする。そしてpipで次を唱える。

pip install -r requirements.txt

すると、pip freezeで出力されたライブラリがすべてインストールされ、移植は完了する(Python関係については)。

まとめ

venvを使えば、requirements.txtだけで移植できる環境を作ることができる。

windowsでできない(未解決)

windowsでやると、たまに下のような症状が出る。

  • Activateを実行してもプロンプトが変わらない
  • pipがエラーで終了する。python -m pipで実行するとNot foundが返る。pythonを立ち上げてpathを見ると、仮想環境のpipへパスが通っていない

pythonpathを手動設定したりしてみたがうまくいかない。

力技で、ディレクトリを別の場所に切りなおして、作ったコードをコピーしてやり直すとうまくいった。

いい対処方法や不具合情報を知っている人がいたら教えてください。


  1. Tensorflowは最近メジャーアップデートがあり、Tensorflow 2.0がリリースされた。しかしTensorflow 1.x.xシリーズのコードをそのまま回すとうまくいかないこともあるので、システムをアップデートするのは結構勇気がいる。「既存の環境を変えたくないけどTensorflow2.0を試してみたいなあ」といったときに、venvを使えば共存させてインストールすることができる。 

  2. 当然システムでもpip freezeはできる。しかしそのプロジェクトで使っていないライブラリも全部出てくるので、余計なものも紛れ込んでしまう。