導入前の状態
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 関連の yum パッケージ名は ‘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’ というモジュールをインストールしています。引数としてインストール先のディレクトリへのパスを指定します。
従来は 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
(env) $ 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) $ python -m 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 の世界におけるパッケージマネージャです。pip の man(マニュアルページ)はないようです。pip のヘルプは pip help install 等で参照可能です。
help によると、’–pre’ (ダッシュは2個)は正式リリース前のものを入れるためのオプションです。デフォルトでは pip は安定版のみをインストールします。
アプリケーションの構築
次に、アプリケーションの構築を行います。紙面の都合により(?)ここでは hello world までです。
(env) $ mkdir work
(env) $ cd work
(env) $ vi hello.py
(env) $ cat hello.py
print("hello, world!")
(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)
Windowsの場合
VSCode+venvに移動しました。
備考
自分は初学者なので、自分の理解を確かめるためもあって上記のような(くどい)説明になっていますが、上級者であれば Pythonのパッケージ周りのベストプラクティスを理解するに従ったほうがよいのかもしれません。