Others

pyenvとvenvを使用した仮想環境構築

海洋
利用環境

macOS Sonoma 14.4.1
zsh

Pythonの実行環境を整えるのはなかなか複雑で、私はなんとなく使っていましたが、今一度整理してみようと思い現状分かる範囲でPythonの環境構築についてまとめました。
なおpyenv自体のインストールについては触れていません。

pyenvとvenvついでにpipの概要

基本的にはこれら3つを使用すれば、Pythonの環境を作ることはできます。
まずは、それぞれのツールの概要を掴んでおきましょう。

pyenv

Github pyenv

Pythonのバージョンを簡単に管理、変更することができます。

PythonのインストールはPythonのサイトから行うよりも、pyenvでインストールしたほうが管理しやすいかと思います。

venv

Python packaging User Guide

仮想的な環境を作るためのもの。
venvによって作成された特定のディレクトリにパッケージをインストールすることで、他の環境に影響を与えない仮想的な環境を作ることができます。
仮想環境作成時にはpyenvにPythonバージョンの管理を行ってもらうので、venvはパッケージのバージョン管理を行うものとも言えます

通常は /bin、/usr/bin、/usr/local/bin などのシステムディレクトリからPythonなどが実行されるところを、仮想環境の中の /bin ディレクトリへとパスを変更することで仮想的な環境を作っています。

pip

pip documentation v24.0

Pythonのパッケージマネージャー。
MacやLinuxにhomebrewやaptなどのパッケージ管理ツールがありますが、pipはPython専用のパッケージマネージャーです。

Python新規プロジェクトの作成手順

それぞれのコマンド等を見ていく前に、まず私が新しくPythonプロジェクトを作成するさいの流れを紹介します。
今回はホームディレクトリ下のDocuments(書類)ディレクトリにprojectnameというプロジェクトを開始していきます。

新規プロジェクトのディレクトリへ移動

ディレクトリをローカルで作成したりGitHubからクローンしてから、そのディレクトリに移動します。

cd ~/Documents/projectname
Zsh
pyenvで使用したいPythonバージョンを設定する
Îpyenv local 3.11.9
Zsh

このコマンドを実行すると、projectnameの中に .python-version というファイルが生成されます。これにより、このプロジェクトで使用するPythonバージョンが設定されます。

※任意のPythonバージョンのインストールに関してはこちらで紹介しています。

仮想環境を作成する
python3 -m venv .venv
Zsh

2つめの.venvは任意の名称にして問題ありませんが、特にこだわりがなければ.venvで良いです。

仮想環境に入る
source .venv/bin/activate
Zsh

.venvは作成時に付けた名称です。
仮想環境に入るとターミナルのプロンプトの一番前に、(.venv)と表示されます。

※2回目以降に仮想環境に入るときは、プロジェクトのディレクトリに移動してから上のコマンドを実行します。

pipを使用して任意のパッケージをインストールする
pip install flask
Zsh

自分の必要なパッケージをインストールします。

作業を行い終わり次第仮想環境を抜ける
deactivate
Zsh

仮想環境から抜けます。

以上が基本的な流れになっています。
ここからはそれぞれのツールでよく使うコマンドなどについて見ていきます。

pyenvコマンド

# インストール可能なバージョンのリストを表示
   pyenv install --list
# Pythonのイントール(インストールしたいバージョンを指定)
   pyenv install 3.12.2
# Pythonのアンイントール(アンインストールしたいバージョンを指定)
   pyenv uninstall 3.12.2
Zsh

インストール周りのコマンドです。アンインストールのさいはそのバージョンがアクティブでない必要があります。さらに消してもいいですか?と確認されるのでyで確定します。

#使用するPythonバージョンの変更
   pyenv local 3.11.9
   pyenv global 3.11.9
Zsh

localは実行したディレクトリに .python-version ファイルを生成することで、そのディレクトリに入ると自動的に設定したバージョンに切り替わり、出ると元のバージョンに戻る状態にしてくれます。

globalは仮想環境などのバージョンが設定されていないところでのPythonのバージョンを変更できます。こちらは変更しない限り変わることはありません。

# インストールされているバージョンの確認
   pyenv versions
#現在設定されているバージョンの確認
   python -V
   pyenv version
   pyenv local
   pyenv global
Zsh

versionsを実行するとインストール済みのものが一覧表示された上で、現在のディレクトリで設定されているバージョンの横に*が付与されています。


バージョン確認の方法は様々あり、それぞれで微妙に役割が異なっています。
python -Vは現在のディレクトリで設定されているバージョンを表示します。

versionもpython -Vとほぼ同じ感覚で使えますが、仮想環境の作り方によっては結果が変わってきます。

localは現在のディレクトリに .python-version ファイルが有れば、そこで設定されているバージョンを表示します。
無ければ、ローカルバージョンが設定されていないと教えてくれます。

globalは現在のディレクトリに関係なく仮想環境の中にいようが、globalで設定されたバージョンを表示します。

venvコマンド

# 仮想環境作成
   python3 -m venv .venv
# 仮想環境に入る
   source .venv/bin/activate
#仮想環境から出る
   deactivate
Zsh

流れのところで説明しましたが、仮想環境作成の前にpyenv localでバージョンを変更しました。
実際はこれを行わずに仮想環境を作成しても、環境が作成されたタイミングで設定されていたglobalバージョンが仮想環境自体に内包されるので、一応venvのみでもPythonバージョンを管理することはできます。

しかしそれには問題があり、プロジェクトディレクトリを移動させた場合等、自分の意図しないバージョンが使用される可能性があります。
ですが、pyenv localを使用しプロジェクトディレクトリに .python-version ファイルが存在していれば、ディレクトリが移動しても常に同じバージョンのPythonが使用されます。

ですので仮想環境作成時にはpyenv localを使用してそのプロジェクトにしっかりバージョンを設定しておくことが大切になります。

pipコマンド

# 最新バージョンのインストール
   pip install flask
# バージョンを指定してインストール
   pip install flask==0.9.0
# バージョン範囲を指定してインストール(例の場合1.0.1以上2.0.0未満)
   pip install 'flask>=1.0.1,<2.0.0'
# 最新バージョンへ更新
   pip install --upgrade flask
#パッケージの削除
   pip uninstall flask
#パッケージの一覧を表示
   pip list
Zsh

一つずつではなく、複数まとめてインストールしたい場合は requirements.txt を使用します。
このファイルを予めプロジェクトディレクトリに用意しておき、以下のコマンドを実行します。

# まとめてインストール
   pip install -r requirements.txt
Zsh
# requirements.txtの記入例
   blinker==1.8.2
   click==8.1.7
   Flask==3.0.3
   itsdangerous==2.2.0
   Jinja2==3.1.4
   MarkupSafe==2.1.5
   Werkzeug==3.0.3
Plaintext

おわりに

まだまだなんとか使えているというくらいで、しっかり理解できていないところも多いので、もっと使いこなせるように積極的に使っていきたいものです。

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

ABOUT ME
海洋
海洋
NWエンジニア
ネットワーク・セキュリティを中心に、業務や検証環境で実際に触れた内容を記録しています。
現職ではネットワークの運用・構築を担当。

保有資格
ネットワーク:ネットワークスペシャリスト / CCNA
セキュリティ:情報セキュリティマネジメント / ISC2 CC
クラウド  :AZ-104 / AZ-305
その他   :応用情報技術者 / LinuC レベル1

記事URLをコピーしました