SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【pyenv】当該サーバ内の全ユーザに指定したPythonバージョンを適用させる

以前の記事で「pyenv」を用いてPythonの最新バージョン(3.8.2)をインストールして、バージョンの切り替えを行いました。
が、再度起動してログインユーザでバージョンを確認すると元のバージョンが表示されました。

以前やったこと

Pythonのバージョン切り替え

詳しくは以下の記事を参照↓↓

www.wantanblog.com


ざっくり言うと

①rootユーザにスイッチ。

②pyenvのダウンロード(クローン)

③環境変数の設定

④pyenvのインストール

⑤pythonのバージョンを切り替え(global)

ーーーーー
翌日
⑥サーバ起動し一般ユーザでログイン

⑦そのまま一般ユーザでpythonのバージョン確認

python2が表示された!なんで??

原因は?

深いところまではそこまで理解しきれていませんが、「③環境変数の設定」が原因と思われます。

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

bashの起動時に読み込む上記の環境変数設定を実行ユーザ(root)のホームディレクトリの「.bash_profile」に記述しているから。

pyenvのバージョンを全ユーザに適用させる

もうインストールしている場合は

仕切り直しする。
pyenvを既にインストールしている場合は以下のコマンドで削除すると後述する手順で再インストールできました。

rm -rf $(pyenv root)

もし特定ユーザのホームディレクトリとかに配置しているなら適当な場所に移動すればそれでも大丈夫かもしれませんが試してはいません。

bashの初期化ファイルに環境変数設定の記述を行っている場合には一旦削除する。

私の場合は以下のファイルの

~/.bash_profile

以下のような環境変数の設定部分を消しました。

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
pythonインストール作業

基本は前回のインストール作業をもとにしているので、もしも足りない部分があったらそちらも参照。

今回は全てのユーザが参照できるように/usr/local/にクローンします。

・ダウンロード(クローン)

git clone https://github.com/pyenv/pyenv.git /usr/local/pyenv

・環境変数の記述
特定のサービスごとのbash初期化処理を配置する/etc/profile.d/pyenv.shを作成します。

vim /etc/profile.d/pyenv.sh

・pyenv.shの記述内容
以下の三行だけ記述します。

export PYENV_ROOT="/usr/local/pyenv"
export PATH="${PYENV_ROOT}/bin:${PATH}"
eval "$(pyenv init -)"

・pyenv.shの再読み込み
実行はしたけどもしかしたらここでは必要ないかも。

source /etc/profile.d/pyenv.sh

・pyenv.shのバージョン確認
バージョンが表示されればインストールには成功しています。

pyenv --version

・python3.8のインストール
インストールするバージョンが確定できていない場合にはリスト表示してから確定させてから実行してください。
リスト表示の仕方は前回記事参照。

インストールにはしばらく時間がかかりました。

pyenv install 3.8.2

・Python3の適用
システム全体でpython3を適用させます。

pyenv global 3.8.2

・権限の変更
後述するエラーの対策として特定ディレクトリの権限を変更しました。
但し、これが正しい対応なのかは不明です。

chmod 777 /usr/local/pyenv/shims/

・bashの再読み込み

exec $SHELL -l

・pythonのバージョン確認

python -V

Python 3.8.2

・一般ユーザへの切り替え
wantan」の部分は自分のユーザ。

su - wantan

再度pythonのバージョン確認して、今回インストールしたバージョンが表示されれば完了です。
ここまでやればサーバを停止して起動し、再度ログインしても指定したバージョンが読み込まれます。

発生したエラーとか

試しているときに発生したエラーについて

書き込み権限がない

rootユーザで一連のインストール作業を行って、一般ユーザでログインすると以下のエラーが発生。

pyenv: cannot rehash: /usr/local/pyenv/shims isn't writable

表示されているディレクトリを確認すると以下のようになっている。

drwxr-xr-x. 2 root root 4096 4月 2 23:18 shims

所有者のroot以外には書き込み権限がないです。
詳しくはわからないですが、起動時になんらかの書き込みをおこなってるようです。

なので、所有者以外の書き込み権限を与える以下のコマンドで対応。

chmod 777 /usr/local/pyenv/shims/

これでエラーは表示されなくなりましたが、正しい対応なのかは不明です。

ユーザ切り替え時に参照権限がない

rootユーザから一般ユーザに切り替えを行った際に以下のエラーが発生した。

su wantan

/usr/local/pyenv/bin/pyenv: 90 行: cd: /root: 許可がありません

エラーメッセージに表示されているファイルの90行目には以下の記述がされていた。

PYENV_DIR=$(cd "$PYENV_DIR" && echo "$PWD")

結果としてはrootのホームでユーザスイッチを行っていたのがいけなかったようです。
一般ユーザに切り替えた際にカレントディレクトリが/rootでそこにcdしようしているからです。

根本的な解決方法は分かりませんでした。

暫定的にはエラー原因から考えてカレントディレクトリを引き継がせない以下のコマンドでスイッチを行う。

su - wantan

または一般ユーザにも参照権限があるディレクトリでスイッチすればエラーが発生しませんでした。