はじめに
- 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を手動設定したりしてみたがうまくいかない。
力技で、ディレクトリを別の場所に切りなおして、作ったコードをコピーしてやり直すとうまくいった。
いい対処方法や不具合情報を知っている人がいたら教えてください。