CLOVER🍀

That was when it all began.

Ubuntu Linux 18.04 LTSで、Pythonの仮想環境(venv)を使用する

昨今のPythonのパッケージ管理事情?

すごく、久しぶりのPythonネタです。

昨今のPython事情があまりよくわかっていないのですが、パッケージ管理ツール、仮想環境といろいろあるようでして…。

パッケージ管理については、このまとめがわかりやすかったです。

Python パッケージ管理技術まとめ (pip, setuptools, easy_install, etc)

あと、こちら。

pip vs easy_install — Python Packaging User Guide

今は、pipが主流なんですねぇ(easy_installくらいまでしか馴染みがない…)。

Python モジュールのインストール — Python 3.6.8 ドキュメント

pip を使ったパッケージ管理

pipはライブラリをグローバルにインストールするため、それをプロジェクトなどの単位で切り替えられるようにする仕組みが、
仮想環境のようです。
※使用するPythonのバージョンは、仮想環境を作成したPythonのバージョンで固定されるそうな

28.3. venv --- 仮想環境の作成 — Python 3.6.8 ドキュメント

venvっていうらしいですね。前身はvirtualenvで、Python 3.4でPython本体に入ったみたいですね。

というわけで、インストールして、少し試してみたいと思います。

環境

環境は、Ubuntu Linux 18.04 LTS。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:    18.04
Codename:   bionic

pipおよびvenvは、パッケージインストールすることにします。

Installing pip/setuptools/wheel with Linux Package Managers — Python Packaging User Guide

Debian/Ubuntu

以下で、pipもvenvも(一緒にsetuptoolsも)インストールされます。

$ sudo apt install python3-venv python3-pip

バージョン確認。

## Python
$ python3 -V
Python 3.6.7


## pip
$ pip3 -V
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)

## venv
$ apt show python3-venv
Package: python3-venv
Version: 3.6.7-1~18.04

〜省略〜

これで、インストールは完了です。

仮想環境を作成してみる

というわけで、venvを使ってみましょう。

仮想環境の作成

ドキュメントに習い、venvをモジュール指定して仮想環境を作成します。作成する環境の名前も、「venv」とします。

$ python3 -m venv venv

これで、「venv」というディレクトリができます。

「ls -l」してみると、すでにいろいろできています…。

$ ls -l venv
合計 20
drwxrwxr-x 2 xxxxx xxxxx 4096  1月  9 23:02 bin
drwxrwxr-x 2 xxxxx xxxxx 4096  1月  9 23:02 include
drwxrwxr-x 3 xxxxx xxxxx 4096  1月  9 23:02 lib
lrwxrwxrwx 1 xxxxx xxxxx    3  1月  9 23:02 lib64 -> lib
-rw-rw-r-- 1 xxxxx xxxxx   69  1月  9 23:02 pyvenv.cfg
drwxrwxr-x 3 xxxxx xxxxx 4096  1月  9 23:02 share

仮想環境を有効化するには、作成した仮想環境内のbinディレクトリにある、activateスクリプトを実行するようです。

$ source venv/bin/activate
(venv) $

すると、ターミナルの表記がちょっと変わります。

この状態で、たとえばnumpyをインストールしてみます。

$ pip3 install numpy

こうすると、作成した仮想環境の「lib/pythonN/site-packages」配下にインストールされます、と。

$ ls -l venv/lib/python3.6/site-packages
合計 40
drwxrwxr-x  2 xxxxx xxxxx 4096  1月  9 23:02 __pycache__
-rw-rw-r--  1 xxxxx xxxxx  126  1月  9 23:02 easy_install.py
drwxrwxr-x 18 xxxxx xxxxx 4096  1月  9 23:06 numpy
drwxrwxr-x  2 xxxxx xxxxx 4096  1月  9 23:06 numpy-1.15.4.dist-info
drwxrwxr-x 11 xxxxx xxxxx 4096  1月  9 23:02 pip
drwxrwxr-x  2 xxxxx xxxxx 4096  1月  9 23:02 pip-9.0.1.dist-info
drwxrwxr-x  5 xxxxx xxxxx 4096  1月  9 23:02 pkg_resources
drwxrwxr-x  2 xxxxx xxxxx 4096  1月  9 23:02 pkg_resources-0.0.0.dist-info
drwxrwxr-x  6 xxxxx xxxxx 4096  1月  9 23:02 setuptools
drwxrwxr-x  2 xxxxx xxxxx 4096  1月  9 23:02 setuptools-39.0.1.dist-info

現在の仮想環境にインストールされているパッケージを確認するには、「pip3 freeze」で、と。

$ pip3 freeze
numpy==1.15.4
pkg-resources==0.0.0

なるほどー。

この仮想環境を終了する時はdeactivateで行い、

$ deactivate

仮想環境自体が不要になったのなら、削除すればOKです。

$ rm -r venv

仮想環境は削除しなくても、仮想環境の中身をクリーンにしたい場合は「--clear」で。この時、deactivateしておく必要があります。

$ python3 -m venv --clear venv

他の環境で、インストールしたパッケージを再現したい場合は?

通常、インストールしたパッケージのバージョンを出力する「pip3 freeze」の結果を「requirements.txt」という
名前のファイルに保存し

$ pip3 freeze > requirements.txt

「pip3 install」時に、「-r」オプションで指定してインストールするらしいです。

$ pip3 install -r requirements.txt

なんとなく、使い方はわかりました、と。

ちなみに、仮想環境中のPythonのバージョンは、こんな感じで固定される…?
※現在参照しているPythonバイナリへのリンクが作成される、ということかな?

$ ls -l venv/bin
合計 32
-rw-r--r-- 1 xxxxx xxxxx 2225  1月  9 23:35 activate
-rw-r--r-- 1 xxxxx xxxxx 1281  1月  9 23:35 activate.csh
-rw-r--r-- 1 xxxxx xxxxx 2445  1月  9 23:35 activate.fish
-rwxrwxr-x 1 xxxxx xxxxx  279  1月  9 23:35 easy_install
-rwxrwxr-x 1 xxxxx xxxxx  279  1月  9 23:35 easy_install-3.6
-rwxrwxr-x 1 xxxxx xxxxx  251  1月  9 23:35 pip
-rwxrwxr-x 1 xxxxx xxxxx  251  1月  9 23:35 pip3
-rwxrwxr-x 1 xxxxx xxxxx  251  1月  9 23:35 pip3.6
lrwxrwxrwx 1 xxxxx xxxxx    7  1月  9 23:35 python -> python3
lrwxrwxrwx 1 xxxxx xxxxx   16  1月  9 23:35 python3 -> /usr/bin/python3

Python自体のバージョンを切り替えるには?

ここまでの話は、Pythonのパッケージに関する管理方法です。

Python自体のバージョンを切り替えるようなツールは、pyenvがあるそうです。

GitHub - pyenv/pyenv: Simple Python version management