19 ポイント 投稿者 GN⁺ 2024-03-26 | 7件のコメント | WhatsAppで共有
  • 複数の Python バージョンを簡単に切り替えられる
  • シンプルで、目立たず、確実に動作する単一目的の UNIX 伝統ツールの思想に従っている
  • このプロジェクトは rbenv と ruby-build から分岐し、Python 向けに修正されたもの

pyenv が行うこと

  • ユーザーベースで グローバル Python バージョンを変更 できる。
  • プロジェクトごとの Python バージョン をサポート。
  • 環境変数を使って Python バージョンを オーバーライド できる。
  • 一度に 複数バージョンの Python コマンド を検索できる。tox を使って Python バージョン間でテストする際に便利。

pyenv がしないこと...

  • Python 自体に 依存しない。pyenv は純粋なシェルスクリプトで作られている。
  • シェルにロードされる 必要がない。代わりに、PATH にディレクトリを追加する shim アプローチを使う。
  • virtualenv を管理しない。もちろん、ユーザーが自分で virtualenv を作成したり、pyenv-virtualenv を使って自動化したりできる。

動作の仕組み

  • pyenv は PATH に挿入された shim 実行ファイルを使って Python コマンドを横取りし、アプリケーションが指定した Python バージョンを決定したうえで、その Python インストールへコマンドを渡す。

PATH を理解する

  • pythonpip のようなコマンドを実行すると、オペレーティングシステムは PATH 環境変数内のディレクトリ一覧から、その名前の実行ファイルを探す。

Shims を理解する

  • pyenv は PATH の先頭に shims ディレクトリを挿入する。rehashing の過程を通じて、インストール済みのすべての Python バージョンに含まれるすべての Python コマンドに対する shims を維持する。

Python バージョン選択を理解する

  • shim を実行すると、pyenv は次のソースから順番に Python バージョンを読み取って使う:
    1. PYENV_VERSION 環境変数(指定されている場合)。
    2. 現在のディレクトリにあるアプリケーション固有の .python-version ファイル(ある場合)。
    3. ファイルシステムのルートに到達するまで各親ディレクトリを検索して見つかった最初の .python-version ファイル(ある場合)。
    4. グローバルな $(pyenv root)/version ファイル。

Pyenv が提供する Python インストール場所を見つける

  • pyenv が決定した Python バージョンに従って、コマンドをその Python インストールへ渡す。
  • 各 Python バージョンは $(pyenv root)/versions 配下の専用ディレクトリにインストールされる。

使い方

追加の Python バージョンをインストール

  • pyenv install を使って追加の Python バージョンをインストールする。

最新バージョンへの自動解決

  • uninstall を除くすべての Pyenv サブコマンドは、完全なプレフィックスを最新バージョンへ自動的に解決する。

拡張サポート付きの Python バージョン

  • 特定の環境でサポートを追加するために、ユーザー提供のパッチを適用した Python リリースがある。

Python バージョンの切り替え

  • Pyenv がインストールした Python を使うには、次のコマンドのいずれかを実行する:
    • pyenv shell
    • pyenv local
    • pyenv global

Python バージョンの削除

  • 時間の経過とともに、$(pyenv root)/versions ディレクトリには Python バージョンが蓄積される。
  • 古い Python バージョンを削除するには pyenv uninstall を使う。

その他の作業

  • 利用可能なすべてのサブコマンド一覧を見るには、pyenv commands を実行する。

pyenv の削除

  • Pyenv を一時的に無効化したり、システムから削除したりするのは簡単。

Pyenv プラグイン

  • プラグインを使うことで、Pyenv の機能をシンプルかつ柔軟で保守しやすい形で拡張・カスタマイズできる。

高度な設定

  • Pyenv の動作を制御する環境変数がある。

開発

  • Pyenv のソースコードは GitHub でホスティングされている。
  • Bats を使ってテストを実行する。

GN⁺ の意見

  • pyenv はさまざまな Python バージョンを管理するのに非常に便利なツール。特に複数のプロジェクトで異なるバージョンの Python を使う必要がある開発者に役立つ。
  • このツールは Python 自体に依存せず、純粋なシェルスクリプトで構成されているため、Python がインストールされていないシステムでも導入と管理が可能。
  • pyenv は virtualenv を直接管理しないが、pyenv-virtualenv プラグインを通じて virtualenv 管理を自動化できるため便利。
  • インストールと使い方が比較的簡単なので、Python バージョン管理が必要な初級ソフトウェアエンジニアでも扱いやすい。
  • pyenv と似た機能を提供する他のツールとしては conda があり、特にデータサイエンスや機械学習の分野で広く使われている。conda はパッケージ管理と環境管理をあわせて提供するため、こうした機能が必要なユーザーに勧められる。
  • pyenv を導入する際は、システムに複数バージョンの Python がインストールされている場合、パスの衝突を避けるための注意が必要。pyenv を使う利点はバージョン管理のしやすさだが、設定を誤るとシステムのデフォルト Python パスに影響を与える可能性がある。

7件のコメント

 
koxel 2024-03-26

conda は注意が必要で、ある程度の規模の企業では
有料です。
会社が小さくても元請けの規模が大きいと納品しづらいです

 
koxel 2024-03-26

conda 自体は BSD で無料ですが、リポジトリとパッケージのライセンスはよく確認してください。

 
tujuc 2024-03-26

asdf を最上位に設定しておいて https://asdf-vm.com/

プロジェクトごとには local で構成したり、コンテナを使ったりもしていますが…

新しい環境の構築+管理をするものがたくさん出てきていて、あまり使わなくなっていますね……(笑)

 
sngwn 2024-03-26

私もまさにそんなふうに使っています。
ははは、個人的には pyenv は少し時代遅れになった感じがあります。

 
joyfui 2024-03-26

rbenv、pyenv、nodenvのようなものが次々と出てくるので、結局anyenvなんてものまで生まれましたね。笑
https://github.com/anyenv/anyenv

 
GN⁺ 2024-03-26
Hacker Newsのコメント
  • pyenv利用に関する警告

    • pyenvには、ユーザーのマシン上でPythonをコンパイルするという大きな欠点がある。
    • この状況で発生しうる失敗パターンは非常に多い。
    • pyenvは初心者がPythonのパッケージング問題を解決するためのツールではなく、設定を標準化するための上級者向けツールである。
    • ユーザーがpyenv起因の問題に悩まされていても、それに気づいていないことが多い。
  • Pythonプログラマーの苦労

    • Pythonプログラマーが経験する不要な困難の多さに驚く。
    • 複数バージョンのPythonをインストールしなければならないのは不合理だ。
    • Pythonプログラムがどこでも動作するという考え方は実用的ではない。
    • すべてが脆く、正確な言語バージョンがなければ動かない。
    • 依存関係の問題が深刻で、パッケージマネージャーを管理するための別の管理ツールが必要な状況になっている。
  • Pythonプログラムを安定して維持するツール

    • Pythonプログラムが最初に書かれたときと同じように動作することを保証するためのツール群の一覧。
    • requirements.txt、pip、pipenv、pyenv、virtualenvなど、さまざまなツールがある。
  • Miseツールの紹介

    • Rustで書かれたMiseはasdfに似ているが、より高速で、デフォルトではshimsがない。
    • ランタイムを並列にインストールし、必要なプラグインをダウンロードする。
    • asdfやpyenvより優れたツールとして使える可能性がある。
  • ASDFの利点

    • ASDFはPythonだけでなく、Rust、Go、Nodeなど複数の言語やさまざまなツールをサポートしている。
  • pyenv利用経験の共有

    • pyenvを使い始めた当初は問題なかったが、複数バージョンのPythonをインストールした後に問題が発生した。
    • pyenvの代わりにpython.orgからPythonをダウンロードし、python<version> -m venv /my/virtual/env を使って仮想環境を管理するほうが安定している。
  • 個人的なPython管理スタック

    • pyenvでPythonのバージョンを管理し、各プロジェクトごとにvenvを使って新しい仮想環境を作成する。
    • プロジェクトの初期化と依存関係の管理にはPoetryを使う。
    • Dropboxを使っている場合は、.venv フォルダーを無視リストに追加する。
    • PyenvはUbuntuに必要な依存関係をすべてそろえた後はうまく動作する。
  • Miseを使ったランタイム依存関係の管理

    • Python、Node、Ruby、Terraformなど、ほとんどのランタイム依存関係を同じ方法で扱えるmiseを使用する。
    • Pythonの仮想環境も有効化できる。
  • macOSワークフローの共有

    • python.orgから必要なPythonバイナリをダウンロードし、virtualenvを使って仮想環境を設定する。
    • pyproject.tomlとpip-compileを使ってプロジェクトを管理する。
    • Pythonプロジェクト管理の世界では多くの変化があったが、このワークフローでそれらをすべて気にせずに済んだ。
 
edunga1 2024-03-26

この状況で発生しうる失敗モードが非常に多い。

ここがあまりにもつらいポイントのように思います。