work.log

エンジニアの備忘録的ブログ

RockyLinuxにPyenvをインストールして複数のPython環境を運用する

投稿:2017-10-10 13:56  更新:

Rocky Linuxで複数のPython環境を構築、運用するメモ書きです。

CentOSの後継にRocky Linuxを使う事を決めたので、それに合わせて記事内容も加筆修正しました。

Rocky Linux 9は執筆時点でPython 3.9.14がデフォルトでインストールされるので当面は困る事は無いと思うのですが、Pythonでアプリを作る場合はOS側とは別にバージョンを管理した方が何かと都合が良いと思います。

本記事ではRocky Linux 9で環境構築をしていますが、Alma Linuxやまだサポート期間が残っているCentOS 7でも同様の手順で構築出来ます。ただし、CentOS 7では3.9以降はインストールに失敗するようなので、早めにRocky LinuxかAlma Linuxに移行した方が良いです。

スポンサーリンク

利用環境

下記条件の開発環境をRocky Linux上に構築します。

  • Rocky Linux 9
  • Pythonのバージョン管理はPyenvを利用
  • アプリを作るときはpyenv-virtualenvでPythonの実行環境を分ける
  • OS 標準のPythonはそのまま残す

Pythonのバージョン管理はPyenvでやるという事はイメージしやすいと思いますが、アプリを作る場合は更にpyenv-virtualenvで個別環境を作ってアプリ毎に管理していきます。

例えばPyenvでPython 3.10をインストールしたとして、そこで3.10を利用する複数のアプリを作っていくと利用パッケージがごちゃごちゃになって管理しきれないので、その問題を解消するためにpyenv-virtualenvを使う感じです。

pyenv-virtualenvを使っておけばサーバの引っ越しも楽になるので、なるべく使っておくと良いでしょう。

Rocky LinuxにPyenvをインストールする

Rocky LinuxにPyenvを導入する手順を書いていきます。

プロンプトの記号は「# = root」、「$ = 一般ユーザ」という表記になっています。

Pyenvに必要なパッケージをインストールする

# dnf -y install gcc bzip2 bzip2-devel openssl openssl-devel readline readline-devel sqlite-devel tk-devel git

Pyenvのインストール

Pyenvは全ユーザーで利用する事を想定して “/usr/local/pyenv” にインストールします。

Pyenvはホームディレクトリにもインストールできるので、インストール権限を持っていない場合は “~/.pyenv” に置き換えてください。

# cd /usr/local/pyenv
# git clone git clone https://github.com/pyenv/pyenv.git
# mkdir {versions,shims}

Pyenvのプラグインをインストール

Pyenvのプラグイン pyenv-virtualenvpyenv-update も同時にインストールします。

pyenv-virtualenvは最初に説明したアプリ毎に個別環境を構築する為のプラグインで、pyenv-updateはPyenv自体をアップデートするプラグインです。

# cd plugins/
# git clone https://github.com/pyenv/pyenv-virtualenv.git
# git clone https://github.com/pyenv/pyenv-update.git

Pyenvの環境設定

PyenvのPathを通す設定を行います。

# echo 'export PYENV_ROOT="/usr/local/pyenv"' >> /etc/profile.d/pyenv.sh
# echo 'export PATH="${PYENV_ROOT}/shims:${PYENV_ROOT}/bin:${PATH}"' >> /etc/profile.d/pyenv.sh

sudo 時も環境設定を引き継げるよう設定してあげます。

# visudo

----- 編集 -----
#Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin <- コメントアウト
# 以下を追加
Defaults        env_keep += "PATH"
Defaults        env_keep += "PYENV_ROOT"

Pyenvの動作確認

設定した環境変数を読み込むには一旦ログアウトして再ログインするか、sourceコマンドで再読み込みさせます。

下記コマンドでPyenvのバージョンが表示されればインストールと環境設定は完了です。

$ source /etc/profile.d/pyenv.sh
$ pyenv --version
pyenv 2.3.7-2-g58bbbf88

Pyenvを使ってPythonをインストールする

Pyenvが使えるようになったら次はPythonをインストールします。

pyenv install -l” と打つとインストールできるバージョンの一覧が表示されます。

$ pyenv install -l
~ 省略 ~
  3.10.1
  3.10.2
  3.10.3
  3.10.4
  3.10.5
  3.10.6
  3.10.7
  3.10.8
  3.11.0
~ 省略 ~

利用するバージョンを指定してこのようにインストールします。

$ sudo pyenv install -v 3.11.0

これだけで簡単にPythonのインストールができます。

新しいバージョンが見つからない場合はPyenvをアップデートする

Pythonの新しいバージョンが出てこない場合はPyenv自体のアップデートが必要です。この時pyenv-updateのプラグインをインストールしていれば簡単にアップデートが出来ます。

$ sudo pyenv update

PyenvでPythonのバージョンを切り替える

Pyenvはシステム全体、ディレクトリ単位でバージョン指定が可能です。ただし、システム全体を変えてしまうと問題が起きると思うので、ディレクトリ単位で設定して運用すると安全です。

ディレクトリ単位でバージョンを指定

$ python --version
Python 3.9.14 <= OSデフォルト

$ mkdir ~/my_python/
$ cd ~/my_python/
$ sudo pyenv local 3.11.0

$ python --version
Python 3.11.0 <= ディレクトリ内で有効なバージョン

ディレクトリ単位の場合は .python-version という設定ファイルが出来てそこでバージョンが指定されます。このディレクトリ配下では指定されたバージョンのPythonが動作し、ディレクトリを抜ければ標準のPythonを使うよう勝手に切り替わります。

アプリ用のディレクトリにPyenvで指定しておけばあとはバージョンを意識しなくても良いので便利です。

OS全体でバージョンを指定

OS全体でバージョンを指定する場合はこのようにします。

$ sudo pyenv global 3.11.0
$ python --version
Python 3.11.0

## 他のユーザーへも反映されます
$ su -
# python --version
python --version
Python 3.11.0

## 戻す場合はこのように
# pyenv global system
# python --version
Python 3.9.14

こんな感じで簡単に切り替え可能です。

pyenv-virtualenvでアプリの個別環境を管理する

Pyenvを使う事でPythonのバージョン管理が出来るようになりましたが、アプリ毎に環境を管理したい場合はpyenv-virtualenvを利用します。

同じバージョンのPythonで全く異なるアプリを作りたい時は、pyenv-virtualenvで環境を分けておくとパッケージがごちゃごちゃにならず便利です。

Pyenvでアプリ毎の環境を設定する

同じバージョンのPythonを利用するアプリ用に2つ環境を用意してみます。

$ pyenv versions
* system (set by /usr/local/pyenv/version)
  3.11.0

## virtualenvの作成
$ sudo pyenv virtualenv 3.11.0 myapp-a-3.11.0
$ sudo pyenv virtualenv 3.11.0 myapp-b-3.11.0

$ pyenv versions
* system (set by /usr/local/pyenv/version)
  3.11.0
  3.11.0/envs/myapp-a-3.11.0
  3.11.0/envs/myapp-b-3.11.0
  myapp-a-3.11.0
  myapp-b-3.11.0

## 作ったvirtualenvを使う
$ pyenv local myapp-a-3.11.0

## このようにパッケージを分けて使える
# pip list
Package    Version
---------- -------
pip        22.3
setuptools 65.5.0

パッケージをそれぞれ管理出来るので、これをやっておけばアプリを引っ越しは楽になります。

引越しの場合はこのように。

引っ越し元

Pyenvでバージョン管理しているディレクトリに移動し、インストールされているパッケージのリスト書き出し。

$ pip freeze > requirements.txt

引っ越し先

引っ越し先でも同じPythonのバージョンをインストール後、バージョン管理しているディレクトリに移動しrequirements.txtからパッケージを一括インストール。

$ sudo pip install -r requirements.txt

PyenvでPythonをアンインストールする

不要になったバージョンは指定して個別にアンインストールもできます。

# sudo pyenv uninstall 3.10.0
pyenv: remove /usr/local/pyenv/versions/3.10.0? y <= yで応答

PyenvとAnacondaの共存には注意

Pythonで機械学習をしたい場合に情報収集をしていると Anaconda という別の仮想環境を構築するアプリケーションがよく目に付きます。こっちは機械学習とかのパッケージをオールインワンで構築してくれる代物で、また別の方法でパッケージ管理をします。

このAnaconda管理下でpipを使うとAnacondaがおかしくなってしまうので注意しましょう。(よくわからずに色々やってたらAnacondaを壊してしまった…)

Pyenvを使うならpipでパッケージを管理。Anacondaならcondaでだけ管理した方がいいみたい。

参考にしたページ
condaとpip:混ぜるな危険

以上、Pyenvのメモでした。

スポンサーリンク

コメント

  1. 匿名 より:

    とても参考になりました!
    一点タイポ?っぽいものが。

    ■ Pyenv のインストール
    # git clone git://github.com/yyuu/pyenv.git ./pyenv

    # git clone https://github.com/yyuu/pyenv.git ./pyenv

    では?

    • miura より:

      コメントありがとうございます。これどっちでもいけますよ。

      gitコマンドが git:// プロトコルをいいように解釈してくれるんだと思います。

      言われて気付きましたがあんまりプロトコル部分を意識してなかったです。

      Git リポジトリの取得

コメントを残す

よく読まれている記事

  • 今日
  • 週間
  • 月間