zaki work log

作業ログやら生活ログやらなんやら

Pythonインタプリタを入れるために開発環境セットアップツールのmiseを使ってみた

以前はpyenvを使ってPython実行環境をセットアップしたりしてたが、Pythonをビルドするところから始めるために必要なdev系パッケージが必要だったり、そのために管理者権限が必要だったりするので、もっと他に手軽な方法が無いか調べたところ、asdfやmiseが使えそうなので試してみた。

methane.hatenablog.jp

asdfは名前だけは知りつつも結局使わずじまいだったけど「最近はmiseというものがあるらしい」という情報を見たのでmiseを試してみることにした。

mise

https://mise.jdx.dev/mise.jdx.dev

読み方はミーズ

Pronounced "MEEZ ahn plahs"

miseそのものが何かはいろんなサイトで紹介されてるのでそちら参考。

一言でいうと「開発環境セットアップツール」とのこと。
mise単体でいろいろな開発ツール(インタプリタとかコンパイラなど)のインストールやバージョン管理・切り替えができる。アプリ開発者だけでなくインフラ系でもAWS CLIやAzure CLI、Terraformやkubectlもあるので入れてみると便利。

インストールと初期設定

https://mise.jdx.dev/getting-started.htmlmise.jdx.dev

Getting Startedに各環境ごとの手順が載っているのでその通りにやればいい。
curlで取得したインストールスクリプトを実行する方法もあるが、aptdnfでもインストールできる。

# dnfでインストールする例
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://mise.jdx.dev/rpm/mise.repo
sudo dnf install -y mise

ちなみにFedora 41だとdnf config-managerのオプションが変わってエラーになるため、以下のように実行する。

sudo dnf config-manager addrepo --from-repofile=https://mise.jdx.dev/rpm/mise.repo
### これだとエラーになる sudo dnf config-manager --add-repo https://mise.jdx.dev/rpm/mise.repo

miseをインストールしたらアクティブ化のためにシェルに設定を追加する。
パッケージでインストールした場合はmiseはパスが通っているので特にパスを気にしないで良い。
(インストールスクリプトを)

# dnfなどでインストールした`mise`で`bash`使用中の場合
echo 'eval "$(mise activate bash)"' >> ~/.bashrc

シェルを再起動(ログインしなおしとか)すれば準備OK

tab補完の設定

mise completionはあるが、前述のmise activate bashで有効になる模様。
ただしそのままだとtab押下時に以下のエラーが発生する。

[zaki@fedora-dev2 ~]$ mise l
Error: usage CLI not found. This is required for completions to work in mise.
See https://usage.jdx.dev for more information.

メッセージが若干わかりづらい(「usage CLI」が無い、らしい)が、その場合は以下コマンドでusageプラグインを追加する。

[zaki@fedora-dev2 ~]$ mise use -g usage
mise Installed executable into /home/zaki/.local/share/mise/installs/usage/2.0.3/usage
mise usage@2.0.3 ✓ installed
mise ~/.config/mise/config.toml tools: usage@2.0.3

これでタブ補完が効くようになる。
use-gは後述。

2025.07.25追記: 上の手順でエラーは出ないがタブ補完が効かない場合は、以下を追加。
これでシェルを再起動すれば補完が効く。はず。

# This requires bash-completion to be installed
mkdir -p ~/.local/share/bash-completion/completions
mise completion bash --include-bash-completion-lib > ~/.local/share/bash-completion/completions/mise

https://mise.jdx.dev/installing-mise.html#autocompletion

公式ドキュメントの記述はサブディレクトリのパスが足りないので注意。

その他

そのほかの細かい環境ごとのインストール手順の説明はInstalling Miseにも載っている。

https://mise.jdx.dev/installing-mise.htmlmise.jdx.dev

Pythonインストール (パッケージのセットアップ)

ユーザーグローバルに使用する

Python 3.13.0を入れたいのであれば mise use -g python@3.13.0 を実行すればOK

### システムにデフォルトで入っているPython
[zaki@fedora-dev2 ~]$ which python
/usr/bin/python
[zaki@fedora-dev2 ~]$ python --version
Python 3.13.1

### miseでPython 3.13.0をインストール
[zaki@fedora-dev2 ~]$ mise use -g python@3.13.0
mise hint use multiple versions simultaneously with mise use python@3.12 python@3.11
mise hint installing precompiled python from astral-sh/python-build-standalone
if you experience issues with this python (e.g.: running poetry), switch to python-build by running mise settings python.compile=1
mise python@3.13.0 ✓ installed
mise ~/.config/mise/config.toml tools: python@3.13.0
[zaki@fedora-dev2 ~]$ 

### 今miseで入れたインタプリタに切り替わっていることを確認
[zaki@fedora-dev2 ~]$ which python
~/.local/share/mise/installs/python/3.13.0/bin/python
[zaki@fedora-dev2 ~]$ python --version
Python 3.13.0
[zaki@fedora-dev2 ~]$ 

初回は依存するパッケージも追加されたりするがそれでも数秒でインストールされ使用可能になる。
-gオプションはグローバルに使うための指定で、どのディレクトリに移動してもこのpythonが使用される。 (グローバルはシステムワイドの意味ではなく、あくまで実行してるユーザー環境に閉じている)

特定のディレクトリ配下でのみ使用する

-gを指定しない場合は、mise useを実行したディレクトリ以下のみで指定のコマンドが使えるようになる。
複数のアプリ開発のプロジェクトをディレクトリ毎に持っていて、各プロジェクトで使用インタプリタのバージョンを分けたい場合などは便利。

### ~/local/src/app1 配下のみでPython 3.10.16を使いたい場合
[zaki@fedora-dev2 app1]$ pwd
/home/zaki/local/src/app1
[zaki@fedora-dev2 app1]$ mise use python@3.10.16
mise python@3.10.16 ✓ installed
mise ~/local/src/app1/mise.toml tools: python@3.10.16
[zaki@fedora-dev2 app1]$
[zaki@fedora-dev2 app1]$ which python
~/.local/share/mise/installs/python/3.10.16/bin/python
[zaki@fedora-dev2 app1]$ python --version
Python 3.10.16

### ~/local/src/app1 のサブディレクトリでもPython 3.10.16が使用される
[zaki@fedora-dev2 app1]$ mkdir subdir
[zaki@fedora-dev2 app1]$ cd $_
[zaki@fedora-dev2 subdir]$ which python
~/.local/share/mise/installs/python/3.10.16/bin/python

### ~/local/src/app1 の外に出るとPython 3.10.16が使用状態が解除される
[zaki@fedora-dev2 subdir]$ cd ../..
[zaki@fedora-dev2 src]$ python --version
Python 3.13.0
[zaki@fedora-dev2 src]$ which python
~/.local/share/mise/installs/python/3.13.0/bin/python

バージョンを変更する

ユーザーグローバルにPython 3.13.0をセットアップしていたが、Python 3.12.8を使いたい場合

[zaki@fedora-dev2 ~]$ mise use -g python@3.12.8
mise python@3.12.8 ✓ installed
mise ~/.config/mise/config.toml tools: python@3.12.8
[zaki@fedora-dev2 ~]$ python --version
Python 3.12.8
[zaki@fedora-dev2 ~]$ which python
~/.local/share/mise/installs/python/3.12.8/bin/python

これで切り替わる。
また3.13.1に切り替える場合は再度3.13.1を指定すればOK

[zaki@fedora-dev2 ~]$ mise use -g python@3.13.0
mise ~/.config/mise/config.toml tools: python@3.13.0

インストール済みのパッケージ一覧はlistで見れる。

[zaki@fedora-dev2 ~]$ mise list
Tool    Version  Source                      Requested 
python  3.10.16 
python  3.12.8  
python  3.13.0   ~/.config/mise/config.toml  3.13.0
python  3.13.1  
usage   2.0.3    ~/.config/mise/config.toml  latest

dev版 (未解決)

2025.01.18時点では3.14はdev版があるが、デフォルトでは使用できない。

[zaki@fedora-dev2 ~]$ mise use -g python@3.14-dev
mise WARN  no precompiled python found for 3.14-dev, force mise to use a precompiled version with `mise settings set python.compile false`
mise ERROR failed to install core:python@3.14-dev
mise ERROR git failed: Cmd(["git", "-C", "/home/zaki/.cache/mise/python/pyenv", "-c", "safe.directory=/home/zaki/.cache/mise/python/pyenv", "fetch", "--prune", "--update-head-ok", "origin", "master:master"]) No such file or directory (os error 2)
mise ERROR Run with --verbose or MISE_VERBOSE=1 for more information

メッセージにある通りmise settings set python.compile trueを実行すればインストールできるかと思ったが、実行すると以下の通りで、なんとなく別の理由(環境回り)でインストールできないぽい。
が、今回これはやりたいことじゃないので保留。

[zaki@fedora-dev2 ~]$ mise use -g python@3.14-dev --verbose
DEBUG ARGS: mise use -g python@3.14-dev --verbose
DEBUG config: ~/.config/mise/config.toml
DEBUG ls: "/home/zaki/.local/state/mise/hints"
DEBUG install_some_versions: python@3.14-dev
INFO  python@3.14-dev install
DEBUG Updating python-build in /home/zaki/.cache/mise/python/pyenv
DEBUG current branch for "/home/zaki/.cache/mise/python/pyenv": master
DEBUG updating /home/zaki/.cache/mise/python/pyenv to master
DEBUG updating /home/zaki/.cache/mise/python/pyenv to master with git
DEBUG $ git -C /home/zaki/.cache/mise/python/pyenv -c safe.directory=/home/zaki/.cache/mise/python/pyenv fetch --prune --update-head-ok origin master:master
Error: 
   0: failed to install core:python@3.14-dev
   1: git failed: Cmd(["git", "-C", "/home/zaki/.cache/mise/python/pyenv", "-c", "safe.directory=/home/zaki/.cache/mise/python/pyenv", "fetch", "--prune", "--update-head-ok", "origin", "master:master"]) No such file or directory (os error 2)

Location:
   src/git.rs:121

Version:
   2025.1.9 linux-x64 (b915c4f 2025-01-17)

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.

その他コマンド覚書

操作 コマンド
インストール可能なパッケージ一覧 mise ls-remote --all
インストール可能なプラグイン一覧 mise plugins ls-remote
インストール可能な指定プラグイン/パッケージのバージョン一覧 mise ls-remote <plugin名>
現在利用中のプラグイン/パッケージ一覧 mise current
インストール済みのプラグイン/パッケージ一覧 mise list
パッケージインストール mise install <package-name>@<version>
パッケージのアクティブ化(カレントディレクトリ) mise use <package-name>@<version>
パッケージのアクティブ化(グローバル) mise use -g <package-name>@<version>

Pythonmise plugins ls-remoteだと出てこなくてmise ls-remoteだと出てくる。対してusageはどっちにも出てきたりして、正直違いがよくわかっていない。
また、mise ls-remote --allの出力と、mise ls-remoteまで入力してtabを2回押下したときの候補一覧も異なる。
が、基本的にこの2つのコマンドでセットアップ可能なパッケージを探せるので事足りると思う。

リポジトリアーカイブされているが、プラグイン一覧はここが見やすい。

github.com

環境

[zaki@fedora-dev2 ~]$ cat /etc/fedora-release 
Fedora release 41 (Forty One)
[zaki@fedora-dev2 ~]$ mise version
              _                                        __              
   ____ ___  (_)_______        ___  ____        ____  / /___ _________
  / __ `__ \/ / ___/ _ \______/ _ \/ __ \______/ __ \/ / __ `/ ___/ _ \
 / / / / / / (__  )  __/_____/  __/ / / /_____/ /_/ / / /_/ / /__/  __/
/_/ /_/ /_/_/____/\___/      \___/_/ /_/     / .___/_/\__,_/\___/\___/
                                            /_/
2025.1.9 linux-x64 (b915c4f 2025-01-17)