カテゴリー
CentOS7 Python

venvによる仮想環境構築とresponderの導入

導入前の状態

CentOS7 に Python3 の仮想環境を導入する。まずは現状の確認。 epel は事前に導入してある。

$ rpm -qa|grep release
epel-release-7-12.noarch
centos-release-7-7.1908.0.el7.centos.x86_64
$ python -V
Python 2.7.5
$ pip -V
-bash: pip: コマンドが見つかりません
$ python3 -V
-bash: python3: コマンドが見つかりません

python3の導入

python2 用の pip および python3 関連パッケージを yum で導入する。python2-pip は epel に含まれるが、python3 と python3-pip は標準ディストリビューションに含まれる。

ここでは 比較のために python2-pip を導入しているが、実際には不要であり、さらに使うべきではない。python3 関連は python3 という prefix になるため、 python2 と混ざることはなさそう。

なお今後、python3 を使った仮想環境に追加でパッケージを導入する際に必要となる、python3-devel も合わせてインストールしておく。

$ sudo yum install python2-pip python3-pip python3-devel

コマンド類の場所や由来等を確認しておく。まずは python2 系。

$ python -V
Python 2.7.5
$ which python
/usr/bin/python
$ ls -l `which python`
lrwxrwxrwx. 1 root root 7  1月 24 07:56 /usr/bin/python -> python2
$ rpm -qf `which python`
python-2.7.5-86.el7.x86_64
$ pip -V
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
$ rpm -qf `which pip`
python2-pip-8.1.2-10.el7.noarch
$ ls -l `which pip`
-rwxr-xr-x. 1 root root 282  8月 12 11:18 /usr/bin/pip

次は python3 系。

$ python3 -V
Python 3.6.8
$ which python3
/usr/bin/python3
$ rpm -qf `which python3`
python3-3.6.8-10.el7.x86_64
$ pip3 -V
pip 9.0.3 from /usr/lib/python3.6/site-packages (python 3.6)
$ rpm -qf `which pip3`
python3-pip-9.0.3-5.el7.noarch

仮想環境の意義

CentOS7 環境では、単に ‘python’ とか ‘pip’ とタイプすると、システムデフォルトの python2 のものが使われる。python3 / pip3 と明示すれば python3 関連が使われるが、仮想環境上で python / pip とタイプすると、透過的に python3 が使えるようになる。動作環境の切り替えには activate/deactivate を使う。

仮想環境のインストール

$ python3 -m venv env

‘-m XXXX’ はモジュールのインストールを行うオプション。ここでは ‘venv’ というモジュールをインストールしている。引数はインストール先のディレクトリへのパス。”env” はディレクトリ名だが、各種 IDE 等が “env” を期待しているようなので素直に “env” とするのが吉。

従来は virtualenv という外部パッケージが多く使われていた(RPM パッケージ名は python-virtualenv)が 、Python 3.3 より venv モジュール配下に virtualenv のサブセットが導入された。さらに Python 3.3 / 3.4 では pyvenv というコマンドで仮想環境をインストールしていたが、Python 3.6 からは非推奨となった。Python公式ドキュメントでも venv をリファレンスとしているので、ここでも venv によるインストールを行う。

カレントディレクトリに env ディレクトリが作られ、その配下に python3 がインストールされる。中身は以下の通り。

$ ls -lF env
合計 4
drwxrwxr-x. 2 vagrant vagrant 173  1月 27 23:50 bin/
drwxrwxr-x. 2 vagrant vagrant   6  1月 27 23:50 include/
drwxrwxr-x. 3 vagrant vagrant  23  1月 27 23:50 lib/
lrwxrwxrwx. 1 vagrant vagrant   3  1月 27 23:50 lib64 -> lib/
-rw-rw-r--. 1 vagrant vagrant  69  1月 27 23:50 pyvenv.cfg
$ python -V
Python 2.7.5

System PATH は従来通り Python2 を向いている。つまり、仮想環境をインストールしただけではシステムには影響を与えない。

CentOS7 では yum や ansible 等、多くのコンポーネントが Python2 に依存しているため、システムグローバルの Python2 環境はいじらない方が無難。

$ which pip
/usr/bin/pip
$ ls -l /usr/bin/pip*
-rwxr-xr-x. 1 root root 224  1月 26 23:32 /usr/bin/pip
lrwxrwxrwx. 1 root root   9  1月 26 23:31 /usr/bin/pip-3 -> ./pip-3.6
lrwxrwxrwx. 1 root root   8  1月 26 23:31 /usr/bin/pip-3.6 -> ./pip3.6
-rwxr-xr-x. 1 root root 224  1月 26 23:32 /usr/bin/pip2
-rwxr-xr-x. 1 root root 224  1月 26 23:32 /usr/bin/pip2.7
-rwxr-xr-x. 1 root root 407  8月  7 17:05 /usr/bin/pip3
-rwxr-xr-x. 1 root root 407  8月  7 17:05 /usr/bin/pip3.6

仮想環境への切り替え

$ source ./env/bin/activate
(env) vagrant@HOSTNAME:~$

activate スクリプトは PATH と PS1(bashのプロンプト文字列)を書き換えるようだ。以下、PS1 の user@host 部分は割愛する。

(env) $ python -V
Python 3.6.8
$ which python
~/env/bin/python
(env) $ pip -V
pip 9.0.3 from /home/vagrant/env/lib64/python3.6/site-packages/pip (python 3.6)
(env) $ which pip
~/env/bin/pip

仮想環境の pip は python3 依存になっているが、古いためアップグレードしておく。なお、これはホームディレクトリ配下の python 環境をアップグレードすることになるため、sudo は不要。

(env) $ pip install --upgrade pip
(env) $ pip -V
pip 20.0.2 from /home/vagrant/env/lib64/python3.6/site-packages/pip (python 3.6)

これで仮想環境上の pip が 9.0.3 から 20.0.2 にアップグレードされた。次に、この仮想環境に responder を追加でインストールする。

(env) $ pip install responder --pre
(env) $ ls -F env/bin/
activate       apistar*       easy_install-3.6*  pip3.6*   responder*
activate.csh   chardetect*    pip*               python@   uvicorn*
activate.fish  easy_install*  pip3*              python3@

env/bin 配下に responder がインストールされた。

pip について

pip( “Pip Installs Packages” または “Pip Installs Python” )は Python の世界におけるパッケージマネージャ。なお、man pip はないらしい。pip のヘルプは pip help install 等で参照可能。

help によると、’–pre’ (ダッシュは2個)は正式リリース前のものを入れるためのオプション。デフォルトでは pip は安定版のみをインストールするとのこと。

アプリケーションの構築

次に、アプリケーションの構築を行う。紙面の都合により(?)ここでは hello world まで。

(env) $ mkdir work
(env) $ cd work
(env) $ vi hello.py
(env) $ python hello.py               # python3 アプリケーションの実行

仮想環境からの脱出(終了)

作業が終わったら、deactivate コマンドにより仮想環境を抜ける。

(env) $ deactivate
$ python -V
Python 2.7.5
$ pip -V
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)

通常環境への復帰

PS D:\xxxx> d:/temp/env/Scripts/deactivate.bat

Windowsの場合

VSCode+venvに移動した。

備考

自分は初学者なので、自分の理解を確かめるためもあって上記のような(くどい)説明になっていますが、上級者であれば Pythonのパッケージ周りのベストプラクティスを理解するに従ったほうがよいのかもしれません。