Overview
共有の開発環境とかで、ユーザごとに pyenv 入れると容量がえらいことになるので、
共通で1つ入れて一般ユーザで使い回せるようにする話。
要点
-
pyenv
group を作る - システム内に1つ pyenv を入れる
-
pyenv
group 所有にして、 - group 読み込み権限を付ける
-
- 一般ユーザを
pyenv
group に所属させる
docker も採用してる手法。
環境
docker でもいいんだけど、せっかくなので vagrant でいきます。
$ vagrant -v
Vagrant 2.2.3
Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
end
ホスト側
起動して
$ vagrant up
vmに入る
$ vagrant ssh
Last login: Wed Feb 5 03:53:55 2020 from 10.0.2.2
[vagrant@localhost ~]$
以降は vm の中で実行
rootになっておきます
[vagrant@localhost ~]$ sudo su -
Last login: 水 2月 5 03:50:50 UTC 2020 on pts/1
[root@localhost ~]#
pyenv環境を作成
環境変数設定用の sh を用意しておく
pyenv.sh
if [ -e /opt/pyenv ]; then
export PYENV_ROOT=/opt/pyenv
export PATH="${PYENV_ROOT}/bin:$PATH"
eval "$(pyenv init -)"
fi
/opt/pyenv
に install します。
$ yum install -y \
@development zlib-devel bzip2 bzip2-devel readline-devel sqlite \
sqlite-devel openssl-devel xz xz-devel libffi-devel findutils
$ curl https://pyenv.run | PYENV_ROOT=/opt/pyenv bash
$ groupadd pyenv \
&& chown -R :pyenv /opt/pyenv/ \
&& chmod g+r -R /opt/pyenv/
$ cp /vagrant/pyenv.sh /etc/profile.d/
確認
vm に入り直して
[vagrant@localhost ~]$ pyenv -v
pyenv 1.2.16
[vagrant@localhost ~]$ pyenv versions
* system (set by /opt/pyenv/version)
バージョン指定で python を入れる
pyenv install
は root じゃないとできないので、
[root@localhost ~]# pyenv install 3.8.1
(..snip..)
[root@localhost ~]# pyenv install 3.7.6
(..snip..)
入りました。
[root@localhost ~]# pyenv versions
* system (set by /opt/pyenv/version)
3.7.6
3.8.1
一般ユーザでも確認。
書き込み権限を付けてないので pyenv: cannot rehash: /opt/pyenv/shims isn't writable
とか出るけど気にせず。
[root@localhost ~]# su - vagrant
Last login: Wed Feb 5 04:01:04 UTC 2020 from 10.0.2.2 on pts/0
pyenv: cannot rehash: /opt/pyenv/shims isn't writable
[vagrant@localhost ~]$ pyenv versions
* system (set by /opt/pyenv/version)
3.7.6
3.8.1
ここまでが準備。
動作確認
vm の中で実行する。
一般ユーザを追加
pyenv
グループに所属させるのを忘れずに。
[root@localhost ~]# useradd foo -G pyenv
[root@localhost ~]# id foo
uid=1001(foo) gid=1002(foo) groups=1002(foo),1001(pyenv)
既存ユーザを group に追加する場合はこう。
[root@localhost ~]# useradd bar
[root@localhost ~]# gpasswd -a bar pyenv
[root@localhost ~]# id bar
uid=1002(bar) gid=1003(bar) groups=1003(bar),1001(pyenv)
一般ユーザで pyenv を使用する
pyenv global
は使えないので、各ユーザごとに pyenv local
する。
3.7.6 を使いたい人
[root@localhost ~]# su - bar
Last login: Wed Feb 5 03:55:34 UTC 2020 on pts/2
pyenv: cannot rehash: /opt/pyenv/shims isn't writable
[bar@localhost ~]$ pyenv local 3.7.6
[bar@localhost ~]$ python -V
Python 3.7.6
virtualenv in pyenv も使える
[bar@localhost ~]$ python -m venv .venv
[bar@localhost ~]$ . .venv/bin/activate
(.venv) [bar@localhost ~]$ python -V
Python 3.7.6
(.venv) [bar@localhost ~]$ which python
~/.venv/bin/python
(.venv) [bar@localhost ~]$ pip install numpy==1.18.1
(.venv) [bar@localhost ~]$ python -c 'import numpy; print(numpy.__version__)'
1.18.1
3.8.1 を使いたい人
[root@localhost ~]# su - foo
Last login: Wed Feb 5 03:54:47 UTC 2020 on pts/1
pyenv: cannot rehash: /opt/pyenv/shims isn't writable
[foo@localhost ~]$ pyenv local 3.8.1
[foo@localhost ~]$ python -V
Python 3.8.1
virtualenv を使わない場合は pip install
に --user
オプションをつけるのを忘れずに。
[foo@localhost ~]$ python -m pip install --user numpy==1.15
[foo@localhost ~]$ python -c 'import numpy; print(numpy.__version__)'
1.15.0
おわり。
ちゃんと運用してないから使い込んでくとどうなるかは不明。
At Your Own Risk でどうぞ。
というか
docker 使おう。