Open3

Python開発環境モダン化

szczytszczyt

モダンなPython開発環境の主要コンポーネント

  1. Pythonバージョン管理: pyenv

    • プロジェクトごとに異なるPythonのバージョンを簡単にインストールし、切り替えることができます。システム全体を汚さずに複数のバージョンを管理できるため、多くの開発者にとって必須ツールとなっています。
  2. パッケージ管理・仮想環境管理・依存関係解決: Poetry または PDM

    • Poetry:
      • pyproject.toml という設定ファイル一つで、プロジェクトのメタデータ、依存関係(本番用・開発用)、Pythonバージョンの指定、スクリプトなどを管理します。
      • 高度な依存関係解決アルゴリズムを持ち、互換性のあるパッケージバージョンを自動で見つけ出します。
      • poetry.lock ファイルで依存関係ツリー全体のバージョンを正確に固定し、環境間での再現性を保証します(pip freeze > requirements.txt よりも堅牢です)。
      • 仮想環境の作成と管理を自動で行います (venv を内部で使用または代替します)。
      • パッケージのビルドとPyPIへの公開もサポートします。
    • PDM (Python Development Master):
      • Poetry と同様に pyproject.toml を中心としたモダンなパッケージマネージャーです。
      • PEP 582 に準拠した __pypackages__ ディレクトリへのパッケージインストールもサポートしますが、従来の仮想環境も利用可能です。
      • Poetry と同様に、依存関係解決、ロックファイル (pdm.lock)、開発依存の分離などの機能を持ちます。Poetry と比較して柔軟性が高い、または設定項目が多いと感じるかもしれません。
    • (比較参考) pip-tools:
      • venv + pip の延長線上で依存関係の固定を行いたい場合に便利です。
      • requirements.in ファイルに必要な直接的な依存関係を記述し、pip-compile コマンドで依存関係ツリーを含んだ requirements.txt (ロックファイル相当) を生成します。
      • pip-sync コマンドで requirements.txt と仮想環境を同期させます。
      • Poetry や PDM ほど統合的ではありませんが、既存のワークフローに導入しやすい場合があります。
  3. コード品質ツール (Linter, Formatter, Type Checker):

    • Ruff: Rust 製の非常に高速な Linter 兼 Formatter。Flake8、isort、pyupgrade など多くのツールの機能を統合しており、設定も pyproject.toml に集約できます。近年、急速に人気が高まっています。
    • Black: "妥協しない" コードフォーマッター。設定項目が少なく、一貫性のあるコードスタイルを強制します。デファクトスタンダードになりつつあります。
    • Mypy: 静的型チェッカー。Python の型ヒント (Type Hints) をチェックし、バグを未然に防ぐのに役立ちます。
    • これらのツールは pyproject.toml で設定を管理でき、Poetry や PDM の開発依存として簡単に追加できます。

おすすめ構成例: pyenv + Poetry + Ruff/Black/Mypy

ここでは、特に人気のある Poetry を使った環境構築手順を示します。

ステップ 1: pyenv のインストールと設定

  • インストール: (OSによって異なりますが、Ubuntu/Debian系の例)
    # 依存パッケージのインストール
    sudo apt update && sudo apt install -y --no-install-recommends \
        make build-essential libssl-dev zlib1g-dev libbz2-dev \
        libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
        libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python3-openssl git
    
    # pyenvのインストール (公式インストーラー推奨)
    curl https://pyenv.run | bash
    
  • シェル設定: インストール後に表示される指示に従い、~/.bashrc~/.zshrc などに pyenv init の設定を追加します。
    # 例: ~/.bashrc の末尾に追加
    export PYENV_ROOT="$HOME/.pyenv"
    [[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
    eval "$(pyenv init -)"
    
    設定後、シェルを再起動するか source ~/.bashrc を実行します。
  • Pythonバージョンのインストール: 使いたいバージョンの Python をインストールします (例: 3.11.3)。
    pyenv install 3.11.3
    
  • 使用するPythonバージョンの設定:
    • グローバルに設定: pyenv global 3.11.3
    • 特定のプロジェクトディレクトリだけで設定: cd my-project && pyenv local 3.11.3 (ディレクトリ内に .python-version ファイルが作成されます)

ステップ 2: Poetry のインストール

  • 公式のインストーラーを使うのが推奨されています。
    curl -sSL https://install.python-poetry.org | python3 -
    
  • インストール後、指示に従って PATH を通します(通常は ~/.local/bin など)。シェルを再起動するか、指示されたコマンドを実行します。
  • 確認: poetry --version

ステップ 3: プロジェクトの作成と初期設定

  • 新しいプロジェクトの作成:
    poetry new my-python-project
    cd my-python-project
    
    これにより、基本的なディレクトリ構造と pyproject.toml が作成されます。
  • 既存プロジェクトへの適用:
    cd existing-project
    poetry init # 対話形式で pyproject.toml を作成
    
  • (任意) 使用する Python バージョンの指定 (pyenv と連携):
    pyenv でプロジェクト用のローカルバージョンを設定しておくと、poetry はそれを認識します。または pyproject.toml で明示的に指定することもできます。
    # pyenv でローカルバージョンを設定 (推奨)
    pyenv local 3.11.3
    
    # または poetry で指定
    # poetry env use 3.11.3
    
  • pyproject.toml の編集:
    生成された pyproject.toml を確認・編集します。特に [tool.poetry.dependencies] (本番依存) と [tool.poetry.group.dev.dependencies] (開発依存) セクションが重要です。

ステップ 4: 依存関係の管理

  • パッケージの追加:
    # 本番依存として追加 (例: requests)
    poetry add requests
    
    # 開発依存として追加 (例: pytest, Ruff, Black, Mypy)
    poetry add --group dev pytest ruff black mypy
    
    poetry add を実行すると、pyproject.toml が更新され、互換性のあるバージョンが poetry.lock に記録され、仮想環境にインストールされます。
  • 依存関係のインストール:
    pyproject.tomlpoetry.lock に基づいて依存関係をインストールします(他の環境でプロジェクトをセットアップする時など)。
    poetry install # 本番依存のみインストール
    poetry install --with dev # 開発依存もインストール
    
    これにより、プロジェクト専用の仮想環境が自動的に作成・管理されます (通常はプロジェクト外のキャッシュディレクトリか、設定によりプロジェクト内の .venv ディレクトリ)。

ステップ 5: コード品質ツールの設定と実行

  • 設定: pyproject.toml に各ツールの設定を追加します。
    [tool.ruff]
    line-length = 88 # Black と合わせる
    select = ["E", "F", "W", "I", "UP"] # 有効にするルール (例: Flake8標準 + isort + pyupgrade)
    ignore = []
    
    [tool.ruff.format] # Ruff のフォーマッタを使う場合 (Black の代替)
    quote-style = "double"
    
    [tool.black]
    line-length = 88
    
    [tool.mypy]
    python_version = "3.11" # プロジェクトのPythonバージョン
    warn_return_any = true
    warn_unused_configs = true
    ignore_missing_imports = true # 必要に応じて設定
    
  • 実行: poetry run を使って仮想環境内でコマンドを実行します。
    # Lint (Ruff)
    poetry run ruff check .
    
    # Format (Ruff)
    poetry run ruff format .
    # または Format (Black)
    # poetry run black .
    
    # Type Check (Mypy)
    poetry run mypy .
    
    または、poetry shell で仮想環境を有効にしてから直接コマンドを実行することもできます。
    poetry shell
    (my-python-project-py3.11) $ ruff check .
    (my-python-project-py3.11) $ black .
    (my-python-project-py3.11) $ mypy .
    (my-python-project-py3.11) $ exit # 仮想環境を抜ける
    

venv からの移行のメリットまとめ

  • 宣言的な依存関係管理: pyproject.toml で必要なものを宣言的に記述。
  • 確実な依存関係ロック: poetry.lock / pdm.lock で環境の再現性を保証。
  • 開発依存の明確な分離: [tool.poetry.group.dev.dependencies] などで管理。
  • 仮想環境の自動管理: 手動での venv 作成・有効化の手間が減る。
  • 統合されたツール: プロジェクト初期化、依存管理、ビルド、公開などを一つのツールで扱える。
  • 設定ファイルの集約: pyproject.toml に多くのツールの設定をまとめられる。

これらのモダンなツールは学習コストが多少ありますが、慣れると開発効率とプロジェクトの保守性を大幅に向上させることができます。特にチーム開発や長期的なプロジェクトではその恩恵が大きいです。まずは小さなプロジェクトで試してみてはいかがでしょうか。

szczytszczyt

はい、承知いたしました。「uv」は最近非常に注目されているツールですので、調査対象に含めて解説します。

先の回答で紹介した pyenv, Poetry, PDM, pip-tools などに加えて、uv についても見ていきましょう。

uv とは?

  • 開発元: Ruff と同じ Astral 社によって開発されています。
  • 特徴: Rust で書かれた、非常に高速な Python パッケージインストーラーおよびリゾルバーです。
  • 目的: 既存の pip, pip-tools (pip-compile, pip-sync), venv の機能を、より高速かつ使いやすい単一のツールで提供することを目指しています。
  • 配布: 単一のバイナリファイルとして提供されるため、インストールが簡単です。

uv の主な機能と特徴

  1. 圧倒的な速度:

    • pip installpip-compile と比較して、依存関係の解決やパッケージのダウンロード・インストールが劇的に高速です。これは Rust による実装と、効率的なキャッシュ戦略によるものです。
    • CI/CD パイプラインや Docker イメージのビルド時間を大幅に短縮できる可能性があります。
  2. pip 互換のインターフェース:

    • 多くのコマンドが pip に似せて作られています (例: uv pip install, uv pip uninstall, uv pip freeze, uv pip list)。これにより、既存の pip ユーザーが比較的移行しやすくなっています。
  3. 依存関係解決とロック:

    • uv pip compile: pip-toolspip-compile のように、requirements.inpyproject.toml から依存関係を解決し、requirements.txt (ロックファイル) を生成します。
    • uv pip sync: pip-toolspip-sync のように、生成された requirements.txt に基づいて仮想環境に必要なパッケージだけをインストール・同期します。
  4. 仮想環境管理:

    • uv venv: Python 標準の venv モジュール (python -m venv .venv) と同様の機能を高速に実行し、仮想環境を作成します。
  5. pyproject.toml サポート:

    • PEP 621 で標準化された pyproject.toml[project] テーブル (依存関係など) を読み取ることができます。
    • uv pip compileuv pip syncpyproject.toml を直接扱うことができます。
  6. グローバルキャッシュ:

    • ダウンロードしたパッケージを効率的にキャッシュし、再利用することで速度を向上させます。

uv と他のツール (Poetry/PDM) との位置づけ

  • 共通点: 依存関係の解決、ロックファイルの生成、仮想環境との連携といった点で共通の目的を持っています。
  • 相違点:
    • スコープ: uv は現時点 (2025年初頭) では、主に pip, pip-tools, venv の置き換えと高速化 に焦点を当てています。一方、PoetryPDM は、これらの機能に加えて、プロジェクト全体の管理 (パッケージのビルド、PyPIへの公開、スクリプト実行 (poetry run ...)、pyproject.toml への依存関係追加コマンド (poetry add ...) など) をより統合的に行うオールインワンツールとしての側面が強いです。
    • pyproject.toml への書き込み: Poetrypoetry addPDMpdm add のように、コマンド実行によって pyproject.toml の依存関係リストを自動で更新する機能は、uv ではまだ実験的な段階です (uv add コマンドは存在しますが、発展途上です)。
    • エコシステム: PoetryPDM はそれぞれ独自のプラグインシステムやエコシステムを持っています。uv はまだ新しいツールですが、Ruff と同じ開発元であることから、今後の発展が期待されています。

uv のユースケース

  • pip / venv / pip-tools の高速な代替: 既存のこれらのツールを使ったワークフローをそのまま高速化したい場合に最適です。
  • CI/CD や Docker ビルドの高速化: 依存関係のインストールがボトルネックになっている場合に大きな効果を発揮します。
  • 一時的な仮想環境でのツール実行: uv venv && uv pip install ... のように、素早く環境を準備してコマンドを実行したい場合。

まとめと推奨

  • uv は、Python のパッケージング周りの基本的なツール (pip, venv, pip-tools) を 速度 の観点から革新する、非常に有望なツールです。
  • venv + pip + requirements.txt (または pip-tools) からの移行 を考えている場合、ワークフローを大きく変えずに速度面の恩恵を受けたいなら、uv は有力な選択肢になります。
  • プロジェクト全体の管理や、pyproject.toml を中心としたより統合的な開発体験 を求めるなら、依然として PoetryPDM が適している場面が多いでしょう。
  • 将来的には: uv がさらに発展し、PoetryPDM が内部的に uv を利用するようになる可能性も十分に考えられます (実際に PDM では実験的なサポートが進んでいます)。

したがって、モダンな Python 開発環境としては、

  1. オールインワンのプロジェクト管理: Poetry または PDM (これらに pyenv, Ruff, Black, Mypy を組み合わせる)
  2. 既存ツールの高速化・置き換え: uv (これも pyenv, Ruff, Black, Mypy と組み合わせ可能)

という選択肢があります。venv からの移行であれば、どちらのアプローチも検討に値します。速度を最優先する、あるいは pip-tools に近い使い方を好むなら uv を試す価値は大きいです。より統合的な管理機能を重視するなら PoetryPDM が良いでしょう。

szczytszczyt

この状況を鑑みると、uv, Poetry, PDM が対応可能かどうかは、なぜ環境変数が効かないのか、そして各ツールが環境変数以外に Proxy を設定する方法を持っているかによります。

1. まずは環境変数の設定を再確認・徹底しましょう (最重要)

pip--proxy 引数なしで動作しない根本原因を解決することが、他のツールを使う上でも最も確実で推奨される方法です。以下の点を確認してみてください。

  • 設定場所と内容:
    • Proxy の環境変数 (HTTP_PROXY, HTTPS_PROXY, NO_PROXY) をどのファイル (例: ~/.bashrc, ~/.profile, ~/.zshrc, /etc/environment) に記述していますか?
    • ユーザー名、パスワード、Proxyサーバーのアドレス、ポート番号は正確ですか?
    • http://https:// のプレフィックスは正しいですか?
    • export キーワードは付いていますか? (例: export HTTP_PROXY="...") これがないとサブプロセスに引き継がれません。
  • 設定の反映:
    • 設定ファイルを編集した後、シェルを再起動しましたか? または source ~/.bashrc のように実行して設定を読み込みましたか?
  • 現在の設定確認:
    • ターミナルで env | grep -i proxy コマンドを実行し、HTTP_PROXY, HTTPS_PROXY, NO_PROXY が期待通りに表示されるか確認してください。

もし、この手順で環境変数が正しく設定され、pip install numpy (引数なし) が成功するようになれば、uv, Poetry, PDM も同様に環境変数を読み取って動作する可能性が非常に高いです。これらのツールも標準的な環境変数を参照するように作られているためです。

2. 各ツールの対応状況と代替策

環境変数の設定がどうしても上手くいかない、または何らかの理由で設定できない場合に、各ツールが Proxy を扱う方法を見てみましょう。

  • uv:

    • 現時点 (2025年初頭) の uv のドキュメントやコマンドヘルプを見る限り、pip のような --proxy コマンドライン引数や、ツール固有の永続的な Proxy 設定機能は提供されていないようです。
    • したがって、uv を利用する場合は、環境変数を正しく設定することが必須となります。上記のステップ1を成功させる必要があります。
  • Poetry:

    • Poetry も直接的な --proxy コマンドライン引数は持ちません。
    • しかし、環境変数以外で Proxy を設定する方法として、poetry config コマンドがあります。これは設定をファイル (例: ~/.config/pypoetry/config.toml) に保存します。
      # HTTP Proxy の設定
      poetry config settings.proxy.http http://user:pass@proxy.com:8080
      
      # HTTPS Proxy の設定 (通常はHTTPと同じか、別途指定)
      poetry config settings.proxy.https http://user:pass@proxy.com:8080
      
      # 設定の確認
      poetry config --list
      
    • この方法であれば、環境変数が効かない状況でも Poetry は Proxy を利用できる可能性があります。
  • PDM:

    • PDM も直接的な --proxy コマンドライン引数は持ちません。
    • Poetry と同様に、pdm config コマンドで Proxy を設定できます。設定はプロジェクトの .pdm.toml か、--global オプションを付ければユーザーのグローバル設定に保存されます。
      # HTTP Proxy の設定 (グローバル設定の場合)
      pdm config --global http.proxy http://user:pass@proxy.com:8080
      
      # HTTPS Proxy の設定 (グローバル設定の場合)
      pdm config --global https.proxy http://user:pass@proxy.com:8080
      
      # 設定の確認
      pdm config --list
      
    • PDM もこの方法で Proxy を利用できる可能性があります。

結論と推奨:

  1. 最優先: まずは環境変数の設定を見直し、pip install numpy (引数なし) が成功するように試みてください。 これが最もクリーンで、uv を含むすべてのツールで有効な可能性が高い根本的な解決策です。
  2. 次善策: 環境変数の設定がどうしても難しい場合、
    • Poetry または PDM であれば、それぞれの config コマンドを使ってツール固有の Proxy 設定を行うことで、Proxy 環境下で利用できる可能性があります。
    • uv を利用したい場合は、現状では環境変数を正しく機能させることが前提となりそうです。

pip--proxy 引数が必要な状況は、環境変数の設定に何らかの問題があることを示唆しています。その問題を解決できれば、モダンなツールへの移行もスムーズに進むはずです。ぜひ一度、環境変数の設定状況を詳しく確認してみてください。