Python Tips: Xserver のレンタルサーバーに Python を入れたい

Xserver のレンタルサーバーに特定のバージョンの Python を入れる方法についてです。

2024 年 1 月時点で Xserver のレンタルサーバー(以下「 Xserver 」)にデフォルトで入っている Python は少し古いバージョンのものです:

$ python -V
Python 2.7.5

$ python3 -V
Python 3.6.8

Python 2.7 と Python 3.6 は公式のサポートが終了しています。

独自に Python をインストールする方法をウェブで検索したところ、大体は次の 2 つの方法が紹介されていました。

  • A) Anaconda ( or Miniconda )を使う方法
  • B) Homebrew (旧 Linuxbrew )を使う方法

A) の Anaconda を使う方法はわりとスムーズに行きそうですが私は Anaconda の利用経験がほとんどありません。 他方 B) の Homebrew の方は Homebrew をインストールするのに新しいバージョンの cURL ・ Git などをインストールする必要があり複雑で時間がかかります。

他にもっとよい方法が無いかということで模索して今回は Rye を使う方法に行き着きました。

Rye is a project and package management solution for Python, created by Armin. It came out of his desire to create a one-stop-shop for all Python needs. It installs and manages Python installations, manages pyproject.toml files, installs and uninstalls dependencies, manages virtualenvs behind the scenes. It supports monorepos and global tool installations.

翻訳:

Rye は Armin によって作られた Python のプロジェクトとパッケージの管理ソリューションです。 Python のあらゆるニーズに対応するワンストップショップを作りたいという彼の願いから生まれました。 Python のインストールと管理、 pyproject.toml ファイルの管理、依存関係のインストールとアンインストール、 virtualenvs の裏側の管理などを行います。 モノレポやグローバルツールのインストールもサポートしています。

Rye は 2024 年 1 月時点では experimental (試験的)ということになっていますが、インストール・アンインストールがとてもかんたんで、まさに今回のような用途には有用だと感じました。 Rye は Python ランタイムの他にプロジェクトとパッケージの管理もできますが、今回は Python ランタイムのインストール用途でのみ使用しました。

今回インストールしたバージョンは次のとおりです。

  • Rye 0.19.0
  • Python 3.12.1
$ rye --version
rye 0.19.0
commit: 0.19.0 (676b1bffa 2024-01-21)
platform: linux (x86_64)
self-python: cpython@3.11
symlink support: true
$ python --version
Python 3.12.1

今回私が Xserver に Rye と Python をインストールした手順を以下かんたんにご紹介します。

環境を確認する

$ uname -s
Linux
$ uname -m
x86_64

Rye をインストールする

$ curl -sSf https://rye-up.com/get | bash

https://rye-up/get の中身は記事執筆時点で次のようになっていました。

#!/usr/bin/env bash
set -euo pipefail

# Wrap everything in a function so that a truncated script
# does not have the chance to cause issues.
__wrap__() {

# allow overriding the version
VERSION=${RYE_VERSION:-latest}
# allow overriding the install option
INSTALL_OPTION=${RYE_INSTALL_OPTION:-""}

REPO=mitsuhiko/rye
PLATFORM=`uname -s`
ARCH=`uname -m`

if [[ $PLATFORM == "Darwin" ]]; then
  PLATFORM="macos"
elif [[ $PLATFORM == "Linux" ]]; then
  PLATFORM="linux"
fi

if [[ $ARCH == armv8* ]] || [[ $ARCH == arm64* ]] || [[ $ARCH == aarch64* ]]; then
  ARCH="aarch64"
elif [[ $ARCH == i686* ]]; then
  ARCH="x86"
fi

BINARY="rye-${ARCH}-${PLATFORM}"

# Oddly enough GitHub has different URLs for latest vs specific version
if [[ $VERSION == "latest" ]]; then
  DOWNLOAD_URL=https://github.com/${REPO}/releases/latest/download/${BINARY}.gz
else
  DOWNLOAD_URL=https://github.com/${REPO}/releases/download/${VERSION}/${BINARY}.gz
fi

echo "This script will automatically download and install rye (${VERSION}) for you."
if [ "x$(id -u)" == "x0" ]; then
  echo "warning: this script is running as root.  This is dangerous and unnecessary!"
fi

if ! hash curl 2> /dev/null; then
  echo "error: you do not have 'curl' installed which is required for this script."
  exit 1
fi

if ! hash gunzip 2> /dev/null; then
  echo "error: you do not have 'gunzip' installed which is required for this script."
  exit 1
fi

TEMP_FILE=`mktemp "${TMPDIR:-/tmp}/.ryeinstall.XXXXXXXX"`
TEMP_FILE_GZ="${TEMP_FILE}.gz"

cleanup() {
  rm -f "$TEMP_FILE"
  rm -f "$TEMP_FILE_GZ"
}

trap cleanup EXIT
HTTP_CODE=$(curl -SL --progress-bar "$DOWNLOAD_URL" --output "$TEMP_FILE_GZ" --write-out "%{http_code}")
if [[ ${HTTP_CODE} -lt 200 || ${HTTP_CODE} -gt 299 ]]; then
  echo "error: platform ${PLATFORM} (${ARCH}) is unsupported."
  exit 1
fi

rm -f "$TEMP_FILE"
gunzip "$TEMP_FILE_GZ" 
chmod +x "$TEMP_FILE"

# Detect when the file cannot be executed due to NOEXEC /tmp.  Taken from rustup
# https://github.com/rust-lang/rustup/blob/87fa15d13e3778733d5d66058e5de4309c27317b/rustup-init.sh#L158-L159
if [ ! -x "$TEMP_FILE" ]; then
  printf '%s\n' "Cannot execute $TEMP_FILE (likely because of mounting /tmp as noexec)." 1>&2
  printf '%s\n' "Please copy the file to a location where you can execute binaries and run it manually." 1>&2
  exit 1
fi

"$TEMP_FILE" self install $INSTALL_OPTION

}; __wrap__

コマンドを実行すると途中で Continue? と聞かれるので y を入力します。

出力:

This script will automatically download and install rye (latest) for you.
######################################################################## 100.0%
Welcome to Rye!

This installer will install rye to /home/<username>/.rye
This path can be changed by exporting the RYE_HOME environment variable.

Details:
  Rye Version: 0.19.0
  Platform: linux (x86_64)

Continue? yes
Installed binary to /home/<username>/.rye/shims/rye
Bootstrapping rye internals
Downloading cpython@3.11.7
Checking checksum
success: Downloaded cpython@3.11.7
Upgrading pip
Installing internal dependencies
Updated self-python installation at /home/<username>/.rye/self
For more information read https://mitsuhiko.github.io/rye/guide/installation

All done!

実行してインストールが成功するとファイル一式が ~/.rye/ 以下に設置されました。

~/.bashrc に設定を追加する

~/.bashrc:

source "$HOME/.rye/env"

インストールされたものを確認する

rye コマンドを実行できるようになりました。

$ rye --version
rye 0.19.0
commit: 0.19.0 (676b1bffa 2024-01-21)
platform: linux (x86_64)
self-python: cpython@3.11
symlink support: true

CPython 3.11.7 がいっしょにインストールされました。

$ rye toolchain list
cpython@3.11.7 (/home/<username>/.rye/py/cpython@3.11.7/install/bin/python3)

Rye の global shims を有効化する

$ rye config --set-bool behavior.global-python=true

今回は Rye でインストールする Python を Rye で管理されたプロジェクトの外でも(=システム Python の代わりに)使いたかったので behavior.global-python=true をセットして global shims を有効にしました。

Rye で Python をインストールする

ここまで来て python -V を実行すると 3.12.1 が無いと言われてエラーが出ました。

$ python -V
error: Requested Python version (cpython@3.12.1) is not installed. Install with `rye fetch`

ここで実行されている python コマンドは Rye が提供するものです。 +VERSION で利用したいバージョンを指定できます。 Python 3.11 を動かす場合は次のようにします。

$ python +3.11 -V
Python 3.11.7

続いてインストール可能なランタイムを確認します。

$ rye toolchain list --include-downloadable
cpython@3.12.1 (downloadable)
cpython@3.11.0 (downloadable)
...
pypy@3.10.12 (downloadable)
...

使いたいバージョンの Python をインストールします。 今回は cpython@3.12.1 を選択しました。

$ rye toolchain fetch cpython@3.12.1
Downloading cpython@3.12.1
Checking checksum
success: Downloaded cpython@3.12.1

インストールできたか確認します。

$ python -V
Python 3.12.1

無事にインストールできました。 つまづきどころなどもなく非常にスムーズでした。

Rye をアップデートする

$ rye self update
Updating to latest
Checking checksum
Updated!
...

今回はインストール直後なので何も起こりませんが、 Rye 本体をアップデートしたいときは rye self update を実行するとよいそうです。

Rye をアンインストールする

$ rye self uninstall

今回は実行しませんでしたがアンインストールしたくなったら rye self uninstall を実行するとよいそうです。

今回私は Xserver のレンタルサーバー上でこの方法を使いましたが、 Xserver にかぎらず他のレンタルサーバーなどでもこの Rye を使った方法が使えそうです。

参考