【Python】バージョン管理の方法を初心者向けにわかりやすく解説【仮想環境】

はじめに

Pythonを使って開発を進めるとき、バージョン管理という考え方が大切になります。
プロジェクトごとに異なるバージョンが必要になる場合もありますし、ライブラリの互換性を保ちたいシーンもあるでしょう。

バージョンが合わずに動作しないコードを無理に実行してしまうと、思わぬエラーが発生します。
実践的な開発では、複数のバージョンを使い分ける場面が少なくありません。

そこでこの記事では、Pythonのバージョン管理についてやさしく解説します。
具体的には、pyenvや仮想環境、pipenv、conda、Dockerといった管理方法を紹介していきます。

この記事を読むとわかること

  • Pythonバージョン管理の基本的な考え方
  • pyenvで複数のバージョンを切り替える手順
  • venvやpipenvで仮想環境を扱う方法
  • condaやDockerを活用したバージョン管理のポイント
  • バージョンが原因で起こりやすいトラブルの対処方法

Pythonのバージョン管理とは

Pythonには3系を中心にいくつものリリースがあります。
小さなリリースの違いであっても、関数名や標準ライブラリの使い方が変わることがあります。

同じソースコードでも、バージョンの違いで結果が変わるケースもあります。
たとえば、ライブラリが対応するPythonのバージョンが限定されている場合などが典型例でしょう。

こうした問題を回避するには、プロジェクト単位でPythonのバージョンを分ける必要があります。
またチーム開発では、メンバー全員が同じバージョンを使うように整えることも重要です。

なぜバージョンを管理する必要があるのか

Pythonのバージョンを管理する目的は大きく分けて3つほど考えられます。
1つ目は、動作の安定性です。
2つ目は、互換性の確保です。
3つ目は、開発効率の向上です。

動作の安定性では、意図しないバージョンの違いによるエラーを避ける意味があります。
特にライブラリが多いプロジェクトではバージョン管理の重要度が増すでしょう。

互換性の確保では、複数の開発者が同じ環境を共有できるかどうかが焦点になります。
チームで作業する場合はもちろん、今後のメンテナンスにおいても非常に役立ちます。

開発効率という面でも、あらかじめ設定した環境を再利用できるので、環境構築の手間を減らせます。
こうしたメリットを実感するためにも、バージョン管理は欠かせないのです。

Pythonバージョン管理の主な方法

バージョン管理の方法はいくつか存在します。
代表的なものを挙げると、pyenv仮想環境 (venv) 、pipenvconda、そしてDockerが考えられます。

pyenvはシステム全体のPythonバージョンを切り替えたり、複数のPythonを使い分けたりするときに役立ちます。
一方でvenvは、1つのPythonバージョンの中でプロジェクトごとにライブラリを分離するのに向いています。

pipenvはvenvをさらに使いやすくしたツールで、仮想環境とパッケージの管理を一括で行いやすくします。
condaは幅広いパッケージ管理と環境管理ができるのがポイントです。

Dockerはコンテナという独立した空間を利用して環境を隔離する方法です。
ここでは、それぞれの特徴や使い方を順に解説していきます。

pyenvの基本的な使い方

pyenvは、複数のPythonバージョンを一括で管理し、必要に応じて切り替えができるツールです。
これを活用すると、1台のPCでPython 3.xを複数インストールして使い分けることが簡単になります。

pyenvを導入しておくと、pyenv installコマンドで別のPythonバージョンを新たに入れることが可能です。
たとえば次のようにすることで、指定のPython 3.xをインストールできます。

pyenv install 3.x.x
pyenv global 3.x.x

上の例では、pyenv globalでシステム全体のバージョンを変更しています。
この設定によって、どのディレクトリにいてもデフォルトで特定のバージョンを利用できるようになるのです。

pyenvでバージョンを切り替える方法

pyenvでは、プロジェクトごとに異なるバージョンを使いたい場合に、pyenv localを使います。
これは、あるディレクトリ内だけでPythonバージョンを変更する仕組みです。

たとえば、プロジェクトフォルダに移動した後、以下のように指定します。

pyenv local 3.x.x

これで、そのフォルダ配下では指定したバージョンのPythonが使われるようになります。
フォルダを移動するとシステム全体の設定に戻るため、複数プロジェクトを同じマシンで並行して進められます。

また、pyenvにはpyenv shellというオプションもあり、端末のセッションだけバージョンを切り替えることができます。
試験的に別のバージョンを使うときなどに便利な機能です。

venvや仮想環境を使ったバージョン管理

pyenvは主にPythonのバージョン自体を切り替えるツールですが、ライブラリの管理についてはvenvがよく使われます。
venvは、1つのPythonバージョンの中で、プロジェクトごとにライブラリのインストール先を分ける仕組みです。

Pythonには標準でvenvモジュールが含まれているので、追加ツールのインストールをしなくても使える場面があります。
特に「ライブラリを間違えてインストールしてしまうのを避けたい」というケースに向いています。

venvの具体的な作り方と使い方

venvを使うには、まずPythonのコマンドで仮想環境を作るディレクトリを指定します。
次の例では、myenvという名前の仮想環境を作成します。

python -m venv myenv

次に、仮想環境を有効化します。
OSやシェルによって若干異なりますが、以下はLinuxやmacOSの例です。

source myenv/bin/activate

これで仮想環境が有効化され、pip installを実行してもシステム全体には影響を与えません。
プロジェクト単位でライブラリを管理できるため、環境が混乱しにくいメリットがあります。

pipenvとは

pipenvは、venvをさらに使いやすくしたパッケージ管理ツールです。
従来のvenvとpipを組み合わせるよりも管理しやすいよう、環境とライブラリを一括で扱う機能があります。

pipenvを使うと、専用のファイルにインストールしたパッケージ情報が記録されます。
これにより、プロジェクトを別の場所に移すときも、同じ環境を再現しやすくなるでしょう。

インストールと基本操作

pipenvのインストールは、通常のpipを使って行います。
例えば以下のように入力します。

pip install pipenv

プロジェクトフォルダ内でpipenv install ライブラリ名とすると、仮想環境とライブラリの情報が作成されます。
一度作成された環境は、pipenv shellコマンドで有効化しながら作業が可能です。

Pipfile と Pipfile.lock の概要

pipenvを使うと、PipfilePipfile.lockというファイルが生成されます。
Pipfileにはどんなライブラリを使っているか、バージョンはどの程度許容するかといった情報が書かれます。

Pipfile.lockは、実際にインストールされたライブラリの正確なバージョンを固定化する役割を果たします。
これら2つのファイルがあるおかげで、再現性の高い環境構築が実現しやすくなるのです。

condaでのバージョン管理

condaは、Pythonだけでなくさまざまな言語やパッケージを管理できるツールです。
AnacondaやMinicondaといった形で配布されており、科学技術系のライブラリを扱う方にとっては便利でしょう。

condaでは、conda createコマンドで独立した環境を作成できます。
Pythonのバージョンを指定する場合もスムーズで、ライブラリのインストールもcondaコマンドで統一的に行えるのが特徴です。

conda 環境の作り方と使い方

condaを使うには、AnacondaやMinicondaを導入した状態でターミナルを開きます。
そこから、以下のようなコマンドで新しい環境を作成できます。

conda create -n myconda python=3.x
conda activate myconda

これにより、mycondaという名前の環境が作られます。
中では指定したバージョンのPythonが使われ、ライブラリをインストールしても他の環境と混ざらないのがメリットです。

Dockerを活用する

バージョン管理をより確実に行いたい場合、Dockerを使ったコンテナ化という方法もあります。
Dockerでは、コンテナという独立した空間の中にPythonやライブラリをまとめてインストールできます。

コンテナを起動すれば、必要なPythonバージョンやライブラリがあらかじめ整った状態で開発が始められます。
さらに、コンテナを破棄すればクリーンな状態に戻せるため、環境の管理がしやすくなるのです。

開発環境をコンテナ化するメリット

コンテナ化のメリットとして挙げられるのは、環境の衝突が起きにくいという点です。
他のプロジェクトと隔離された状態なので、バージョンやライブラリの混在を回避できます。

また、Dockerfileを用意しておけば、誰でも同じ手順でコンテナイメージを作成できるのもメリットです。
これにより、共同開発でも環境構築のばらつきを抑えられます。

Dockerfileのイメージ例

コンテナ化の概要をつかんでもらうために、簡単なDockerfileの例を示します。
以下ではPythonのイメージを使って、必要なライブラリをインストールしています。

FROM python:3.9-slim

WORKDIR /usr/src/app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "main.py"]

このDockerfileがあるディレクトリにrequirements.txtmain.pyが配置されていれば、イメージのビルドとコンテナ起動により、決まったバージョンのPythonとライブラリをセットで使うことができます。

よくあるトラブルシューティング

バージョン管理をしていても、環境が競合してしまうケースがまったくないわけではありません。
何らかの設定が中途半端になっていると、意図しないPythonが呼び出されることがあります。

例えば、pyenvを導入したけれどもPATHの設定に誤りがあると、システム標準のPythonが先に呼ばれることがあるでしょう。
このようなときは、ターミナルでwhich pythonecho $PATHを確認しながら、pyenvの設定ファイルを見直すのが基本的な対処方法です。

パスが競合してしまう場合

pyenvやconda、あるいはvenvなどを複数導入していると、ときどきパスが衝突して「どのPythonが動いているのかわからない」という事態が起きます。
その場合は、使用したいツールの初期化スクリプトが正しく読み込まれているかを確認してください。

また、シェルの設定ファイル(.bashrcや.zshrcなど)が複数ある環境では、どこで何を上書きしているのか把握する必要があります。
ひとつずつ設定をコメントアウトしてみるなど、問題箇所を切り分けていくのがトラブルシューティングの近道です。

pip のバージョンが違う問題

仮想環境をアクティベートしたつもりでも、pipのバージョンだけがずれているケースがあります。
たとえば、システム全体のpipコマンドが先に呼び出され、実際にはグローバルにライブラリがインストールされてしまう状況です。

このようなときは、pip --versionでどこのpipが呼ばれているかをチェックし、誤っている場合はPATH設定を直しましょう。
エイリアスやシンボリックリンクが残っていないかもあわせて確認するとトラブルを減らせます。

もしグローバルなpipを使ってしまうと、本来の環境とは別の場所へライブラリがインストールされる可能性があります。
意図しないバージョンを使ってしまう原因にもなるので、どのpipを使っているのかは確認を心がけたいところです。

まとめ

Pythonのバージョン管理は、一見すると面倒に感じるかもしれません。
しかし、実際に開発を進めると複数の環境が必要になる場面が多々あり、後から環境を作り直す方がよほど大変です。

pyenvを利用して異なるPythonのバージョンをインストールし、venvやpipenvでプロジェクトごとのライブラリを管理するのはよくあるパターンです。
また、condaやDockerといったツールを使うと、さらに柔軟な運用ができるようになります。

皆さんの作りたいアプリや、チームの開発スタイルに合わせて管理手段を選び、慣れていくことが大切です。
ぜひ、Pythonを使ったプロジェクトをスムーズに進めるためにも、バージョン管理の基本を押さえておいてください。

Pythonをマスターしよう

この記事で学んだPythonの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。