はじめに

Python 仮想環境に関するこの実験へようこそ。仮想環境を使用する目的は、Python コードをカプセル化された環境でテストし、特定のプロジェクトでしか使用しないライブラリでベースの Python インストール環境を汚染しないようにすることです。この習慣は、クリーンで再現性が高く、競合のない開発環境を維持するために不可欠です。

この実験では、Python の仮想環境と依存関係を管理するための 5 つの主要なツールを実際に体験します。

  • virtualenv: 独立した Python 環境を作成するための基礎的なツール。
  • Poetry: 依存関係の管理、パッケージング、公開を一つにまとめたオールインワンツール。
  • Pipenv: Python のパッケージングにおける「良いとこ取り」を目指したツール。
  • Anaconda: 強力な環境管理機能を備えた、データサイエンスで広く利用されているプラットフォーム。
  • UV: 非常に高速な、次世代の Python パッケージインストーラー兼リゾルバー。

この実験を終える頃には、プロジェクトのニーズに合わせて適切なツールを選択し、使いこなせるようになっているはずです。

virtualenv

このステップでは、virtualenv を使用して独立した Python 環境を作成・管理する方法を学びます。virtualenv は、Python コードをカプセル化された環境でテストし、特定のプロジェクト専用のライブラリでベース環境を汚染しないようにするためのツールです。このツールはあらかじめインストールされています。

まず、仮想環境を保存するためのディレクトリを作成し、HelloWorld という名前の新しい仮想環境を作成しましょう。WebIDE でターミナルを開き、以下のコマンドを実行してください。

mkdir -p ~/.virtualenvs
virtualenv ~/.virtualenvs/HelloWorld

環境が作成される際にいくつかの出力が表示されます。仮想環境は ~/.virtualenvs/HelloWorld ディレクトリに作成されます。

created virtual environment CPython3.10.12.final.0-64 in 257ms
  creator CPython3Posix(dest=/home/labex/.virtualenvs/HelloWorld, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/labex/.local/share/virtualenv)
    added seed packages: pip==24.0, setuptools==69.5.1, wheel==0.43.0
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

次に、仮想環境を有効化します。これにより、ターミナルのプロンプトに (HelloWorld) と表示され、仮想環境がアクティブであることが示されます。pip を使用してインストールするものはすべてこの環境専用となり、グローバルな Python インストールには影響しません。

source ~/.virtualenvs/HelloWorld/bin/activate

有効化後、プロンプトが以下のように変化します:

(HelloWorld) labex:project/ $

仮想環境を終了するには、単に deactivate コマンドを使用します:

deactivate

ターミナルのプロンプトから (HelloWorld) というプレフィックスが消えたことを確認してください。

後で環境を再有効化するには、どこからでも再度 source コマンドを使用できます:

source ~/.virtualenvs/HelloWorld/bin/activate

プロンプトが元に戻り、再び HelloWorld 環境に入り、プロジェクトの作業を再開できます。

Poetry

このステップでは、Python の依存関係管理とパッケージングのためのモダンなツールである Poetry を探求します。Poetry を使うと、プロジェクトが依存するライブラリを宣言でき、それらの管理(インストールや更新)を自動化できます。Poetry はこの環境にインストール済みです。

仮想環境が非アクティブであることを確認してください。

deactivate

まず、Poetry を使用して新しいプロジェクトを作成しましょう。このコマンドは、プロジェクトの標準的なディレクトリ構造をセットアップします。

poetry new my-poetry-project

このコマンドにより、my-poetry-project という名前の新しいディレクトリが以下の構造で作成されます:

my-poetry-project
├── pyproject.toml
├── README.md
├── my_poetry_project
│   └── __init__.py
└── tests
    ├── __init__.py
    └── test_my_poetry_project.py

ここで最も重要なファイルは pyproject.toml で、プロジェクトとその依存関係を管理します。初期の内容を確認してみましょう。

cat my-poetry-project/pyproject.toml

出力は以下のようになります:

[tool.poetry]
name = "my-poetry-project"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.10"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

次に、新しいプロジェクトディレクトリに移動します:

cd my-poetry-project

新しい依存関係を追加するには、poetry add コマンドを使用します。Poetry は自動的に適切なバージョンを見つけ、pyproject.toml に追加します。ここでは pendulum ライブラリを追加してみましょう。

poetry add pendulum

pyproject.toml にリストされているすべての依存関係をインストールする場合(例えばプロジェクトをクローンした際など)は、以下を実行します:

poetry install

最後に、依存関係を削除するには poetry remove コマンドを使用します:

poetry remove pendulum

これによりパッケージが削除され、pyproject.toml ファイルが適切に更新されます。

Pipenv

このステップでは、Python のパッケージングにおける「良いとこ取り」を目指したツール、Pipenv の使い方を学びます。Pipenv はプロジェクト用の仮想環境を自動的に作成・管理し、パッケージのインストールやアンインストールに合わせて Pipfile を更新します。

まず、新しいプロジェクト用のディレクトリを作成し、そこに移動します。

cd ~/project
mkdir my_pipenv_project
cd my_pipenv_project

次に、パッケージをインストールしてみましょう。Pipenv は自動的に新しい仮想環境を作成し、依存関係を追跡するための Pipfile を作成します。ここでは requests ライブラリをインストールします。

pipenv install requests

コマンド完了後、ディレクトリ内に Pipfile と Pipfile.lock という 2 つの新しいファイルが生成されます。Pipfile はプロジェクトが必要とする依存関係を追跡するために使用されます。内容を確認してみましょう:

cat Pipfile

出力には、[packages] の下に requests パッケージがリストされているはずです。

[[source]]
url = "https://pypi.org/simple"
verify_ssl = false
name = "pypi"

[packages]
requests = "*"

[dev-packages]

[requires]
python_version = "3.10"

プロジェクトに関連付けられた仮想環境を有効化するには、以下を実行します:

pipenv shell

ターミナルのプロンプトが変化し、プロジェクトの独立した環境内にいることが示されます。

パッケージをアンインストールするには、有効化されたシェル内で uninstall コマンドを実行します:

pipenv uninstall requests

仮想環境のシェルを終了するには、単に exit と入力します:

exit

Anaconda

このステップでは、Anaconda を始めます。Anaconda は科学計算のための Python および R のディストリビューションであり、パッケージ管理とデプロイを簡素化します。そのパッケージマネージャーである conda は、環境の作成と管理に非常に優れています。ターミナルでは conda コマンドが利用可能です。

まず、my_conda_env という名前の新しい環境を作成しましょう。使用する Python のバージョンも指定します。-y フラグは、プロンプトに対して自動的に「はい」と答えるためのものです。

cd ~/project
conda create -n my_conda_env python=3.10 -y

環境が作成されたら、それを使用するために有効化する必要があります。

conda activate my_conda_env

ターミナルのプロンプトに (my_conda_env) というプレフィックスが付き、環境がアクティブであることが示されます。今インストールするパッケージはすべてこの環境専用となります。例として numpy をインストールしてみましょう。

conda install numpy -y

環境での作業が終了したら、無効化できます。

conda deactivate

プロンプトからプレフィックスが消え、ベース環境に戻ります。

UV

このステップでは、Ruff の開発元である Astral が提供する、非常に高速な Python パッケージインストーラー兼リゾルバーである UV を紹介します。これは pip や pip-tools のワークフローをそのまま置き換えられるように設計されており、10 倍から 100 倍高速になる可能性があります。UV はあらかじめインストールされています。

まず、新しいプロジェクトを初期化しましょう。uv init コマンドは pyproject.toml ファイルを作成し、.venv ディレクトリ内に仮想環境を作成します。

cd ~/project
uv init my-uv-project

次に、作成されたプロジェクトディレクトリに移動します。

cd my-uv-project

依存関係を追加するには uv add コマンドを使用します。これは poetry add や npm install に似ています。requests ライブラリを追加してみましょう。

uv add requests

UV は現在のディレクトリにある仮想環境を自動的に検出し、使用します。この管理された環境内でコマンドを実行するには uv run を使用します。環境内の Python バージョンを確認してみましょう。

uv run python --version

グローバルな Python ではなく、仮想環境の Python バージョンが表示されるはずです。

手動でシェルを有効化したい場合は、標準の venv と同様に行うことができます:

source .venv/bin/activate

プロンプトが (.venv) と表示され、環境がアクティブであることが示されます。有効化されたシェルを終了するには、deactivate コマンドを使用します。

deactivate

UV は、パッケージ管理と環境管理を単一の非常に高速なバイナリで提供することで、ワークフローを簡素化します。

まとめ

この実験では、Python の仮想環境と依存関係を管理するためのいくつかの重要なツールを実際に体験しました。プロジェクトの環境を適切に管理することは、すべての Python 開発者にとって基本的なスキルであり、再現性を確保し、競合を回避するために不可欠です。

以下のことを学びました:

  • virtualenv を使用して、基本的で独立した環境を作成、有効化、管理する方法。
  • Poetry を活用し、pyproject.toml ファイルを通じてプロジェクト作成、依存関係管理、パッケージングを一元化するワークフロー。
  • Pipenv を使用して Pipfile でアプリケーションの依存関係を宣言的に管理し、開発環境のセットアップを簡素化する方法。
  • Anaconda (conda) を使用して環境を作成・管理する方法(複雑なパッケージの堅牢な処理により、データサイエンスコミュニティで特に人気があります)。
  • UV を発見しました。これはパッケージのインストール、解決、環境管理を単一のバイナリに統合した、新しく非常に高速なツールです。

各ツールにはそれぞれの強みがあり、最適な選択はプロジェクトの具体的なニーズや個人のワークフローの好みによって異なります。これで、情報に基づいた決定を下し、Python プロジェクトを効果的に管理する準備が整いました。