🙆‍♀️

pyenvとPoetryでPythonの開発環境を整える

2023/11/17に公開

現状

  • pyenvを使ってPythonをインストール
  • virtualenvを使ってPythonの仮想環境を構築

今回は、pyenvはそのままで仮想環境にPoetryを採用して、既存のDjangoのプロジェクトを開発を進めるのが目的。

Pythonのインストール方法

  1. 直接PCにインストールする方法
  2. pyenvやasdfなどのPCに複数バージョンのPythonをインストールできるツールを使う方法

1でやっちゃうと複数プロジェクトを作る時に、バージョンの競合が起きて
めんどくさいことになるので2の方法を使う。

仮想環境内でPythonのバージョンを切り替えられると思いっきり勘違いしていた。
それは多分Djangoのバージョンとかだ。

ベースPythonの使用: 仮想環境を作成する際、virtualenvやvenvは現在アクティブなPythonインタープリタ(システムのデフォルトのPythonやpyenv経由でインストールされた特定のバージョン)をベースとして使用します。

(Pythonのバージョン管理ツール)pyenvとは

pyenvはPythonのバージョン管理ツールです。これは、特定のシステムまたはプロジェクトごとに異なるPythonのバージョンを簡単にインストールし、切り替えることができるように設計されています。

主な機能

  1. 多様なPythonバージョンのインストール: pyenvを使用すると、複数のPythonバージョンを簡単にインストールできます。公式リリースはもちろん、開発版や特定のパッチが適用されたバージョンも含まれます。
  2. グローバルとローカルの環境切り替え: システム全体(グローバル)または特定のプロジェクト(ローカル)用に異なるPythonバージョンを設定できます。
  3. シンプルなバージョン切り替え: コマンド一つで簡単に異なるバージョンに切り替えられます。

使用するメリット

  1. バージョン固有の依存関係の管理: 異なるプロジェクトで異なるPythonバージョンを使う必要がある場合、pyenvはその管理を容易にします。
  2. システムPythonとの分離: システムにプリインストールされているPythonとは独立して、異なるバージョンのPythonを扱うことができます。これにより、システムレベルの問題を回避しながら開発を行うことができます。
  3. 開発環境の一貫性: 複数の開発者が同じプロジェクトに取り組む際、pyenvを使用すると全員が同じPythonバージョンを使用していることを保証できます。これにより、バージョンに依存する問題を避けることができます。
  4. 簡単なバージョンアップグレードとテスト: 新しいPythonバージョンがリリースされたとき、pyenvを使用して簡単に最新バージョンをテストし、プロジェクトの互換性を確認できます。

結論

pyenvは、Pythonのバージョン管理において非常に柔軟で強力なツールです。異なるプロジェクトや環境に対して異なるPythonバージョンを必要とする開発者にとって、pyenvはプロジェクトの依存関係を整理し、開発プロセスをスムーズにするための有効な選択肢となります。

インストール方法

https://prog-8.com/docs/python-env

(仮想環境)venvとvirtualenvとPoetryの違いは?

venv, virtualenv, poetry は、すべてPythonの仮想環境を作成・管理するツールですが、それぞれ特徴が異なります。

1. venv

  • 説明: venv はPython 3.3以降に標準で含まれている仮想環境管理ツールです。
  • 特徴:
    • Pythonの標準ライブラリの一部であり、追加のインストールが不要。
    • 簡単に使えるが、機能は基本的なものに限られる。
    • プロジェクトごとに独立したPython環境を作成できる。

2. virtualenv

  • 説明: virtualenv は、より古いバージョンのPythonでも使用可能な、独立したPython仮想環境を作成するためのツールです。
  • 特徴:
    • venv よりも前から存在し、Python 2との互換性がある。
    • venv よりも多機能で、さまざまなカスタマイズが可能。
    • 環境ごとにPythonのバージョンを選択できる。

3. Poetry

  • 説明: Poetry は依存関係の管理とパッケージの作成を簡単にするためのツールで、仮想環境の管理機能も備えています。
  • 特徴:
    • 依存関係の解決とパッケージ管理に重点を置いている。
    • pyproject.toml ファイルを使用してプロジェクトの設定を管理。
    • 仮想環境の作成と管理のほか、パッケージのビルドと公開もサポート。

総括

  • venv はPython標準の基本的な仮想環境ツール。
  • virtualenv はより多機能でカスタマイズ性が高いが、別途インストールが必要。
  • Poetry は依存関係とパッケージ管理に特化し、仮想環境の管理も行える高度なツール。

プロジェクトの要件や好みに応じて、適切なツールを選択することが重要です。

pyenvPoetryを使って既存のDjangoプロジェクトを動かすためには、いくつかのステップを踏む必要があります。以下に一般的な手順を示します。

Poetryのインストール

Poetryのインストール: まだPoetryがインストールされていない場合は、インストールします。

自分はMacなので以下のコマンドを実行

curl -sSL https://install.python-poetry.org | python3 -

最新のインストール方法やOSごとの違いもあるので公式を参照
https://python-poetry.org/docs/#installing-with-the-official-installer

Poetryをインストールした後に行うべき手順は以下の通りです。

PATH環境変数の設定

Poetryの実行ファイルがインストールされたディレクトリ(この場合は /Users/***/.local/bin)をシステムのPATH環境変数に追加する必要があります。これにより、ターミナルのどこからでもpoetryコマンドを実行できるようになります。

パスの確認

echo $PATH | tr ':' '\n'
  • Zshを使用している場合: ~/.zshrc ファイルを編集します。
  • Bashを使用している場合: ~/.bashrc(Linux)または ~/.bash_profile(Mac)ファイルを編集します。

ファイルを編集して以下の行を追加します:

export PATH="/Users/***/.local/bin:$PATH"

この変更を反映させるために、ファイルを保存し閉じた後、ターミナルを再起動するか、次のコマンドを実行します:

  • Zshの場合: source ~/.zshrc
  • Bashの場合: source ~/.bashrc または source ~/.bash_profile

Poetryのセットアップの確認

Poetryが正しくインストールされ、PATHに追加されたことを確認するには、次のコマンドを実行します:

poetry --version

このコマンドがPoetryのバージョン情報を表示すれば、Poetryは正しくセットアップされています。

https://zenn.dev/kkj/articles/d14470babe1930
https://devops-blog.virtualtech.jp/entry/20230808/1691462598

Poetryを使用して既存のDjangoプロジェクトの開発環境を構築するには、次の手順を実行します。

1. Poetryのインストール

まず、Poetryがまだインストールされていない場合は、インストールする必要があります。あなたはすでにPoetryをインストールしているようなので、このステップは既に完了しているかもしれません。

2. プロジェクトのクローンまたは作成

既存のリポジトリからDjangoプロジェクトをクローンするか、または既存のプロジェクトのディレクトリに移動します。

git clone https://your-django-project-repo.git
cd your-django-project-repo

3. pyproject.tomlの作成

pyproject.tomlファイルをプロジェクトのルートディレクトリに作成する必要があります。このファイルは、プロジェクトの依存関係とPoetryの設定を定義します。

poetry init
Would you like to define your main dependencies interactively? (yes/no)

このメッセージは、poetry init コマンドを実行した際に表示されるもので、Poetryが対話式で主要な依存関係(プロジェクトで使用するパッケージ)を設定するかどうかを尋ねています。

  • yes: 選択すると、Poetryが対話式に各依存関係を設定するための質問を開始します。コマンドラインで必要なパッケージの名前とバージョンを一つずつ入力するよう求められます。

  • no: 選択すると、対話式のプロセスをスキップし、手動でpyproject.tomlファイルに依存関係を追加することになります。たとえば、poetry add package-name コマンドを使用してパッケージを個別に追加できます。

選択は、プロジェクトの要件と個人の好みに基づいて行います。既にrequirements.txtがあり、それをそのまま使いたい場合は「no」と答えて、後でrequirements.txtの内容をpoetryにインポートすることができます。

Would you like to define your development dependencies interactively? (yes/no)

このメッセージは、poetry init コマンドの一部として表示され、Poetryが対話的に開発用の依存関係(プロジェクトの開発時にのみ必要となるパッケージ、例えばテストライブラリやリントツールなど)を定義するかどうかを尋ねています。

  • yes: このオプションを選択すると、Poetryが一連の対話形式のプロンプトを通じて、どの開発用パッケージをプロジェクトに追加するかを尋ねてきます。ユーザーはそれぞれの開発用依存関係を指定することができます。

  • no: このオプションを選択すると、開発用依存関係の対話的設定をスキップし、後で手動でこれらをpyproject.tomlに追加することができます。poetry add --dev package-name コマンドを使って、開発用依存関係を個別に追加できます。

どちらのオプションを選択するかは、プロジェクトのニーズや個人の作業フローによって異なります。プロジェクトにすでに明確な開発用依存関係がある場合や、すぐに必要なパッケージを知っている場合は、「yes」と答えると効率的です。一方で、依存関係を後で一括で追加する予定がある場合は、「no」と答えて対話式プロセスをスキップすることができます。

4. 依存関係の追加

プロジェクトの依存関係をpyproject.tomlに追加します。もしrequirements.txtがある場合は、Poetryを使用して依存関係をインポートできます。

poetry add $(cat requirements.txt)

5. 仮想環境の作成と依存関係のインストール

Poetryは自動的に適切な仮想環境を作成し、pyproject.tomlにリストされた依存関係をインストールします。

※これは4を実行したなら不用

poetry install

6. 開発環境のアクティベート

Poetryによって作成された仮想環境をアクティベートします。

poetry shell

7. Djangoプロジェクトの実行

Poetryの仮想環境内でDjangoプロジェクトを実行します。

python manage.py runserver

8. 追加設定

プロジェクトによっては、データベースの設定、静的ファイルの設定、環境変数の設定など、追加の設定が必要になる場合があります。必要に応じて、.envファイルやsettings.pyを適宜更新してください。

以上のステップにより、Poetryを使用して既存のDjangoプロジェクトの開発環境をセットアップすることができます。Poetryは依存関係の管理をシンプルにし、プロジェクトごとの環境を維持するのに役立ちます。

9. .gitignoreの設定

Poetryを使用しているプロジェクトでGitで除外すべきファイルやディレクトリは、主に以下のものがあります。

  1. /venv/ または /env/: Poetryはプロジェクトごとに仮想環境を作成します。これらの仮想環境フォルダ(通常は.venvという名前ですが、プロジェクトによって異なる場合があります)は、各開発者の環境に依存するため、Gitで追跡するべきではありません。

  2. __pycache__/ ディレクトリ: Pythonファイルの実行時に生成されるキャッシュファイルを含むディレクトリで、これもプロジェクトのソースコードとは独立しており、Gitで追跡する必要はありません。

  3. .pyc ファイル: これはコンパイルされたPythonファイルで、__pycache__ディレクトリ内に存在することが多いです。これらもGitで追跡する必要はありません。

  4. poetry.lock: このファイルはプロジェクトの依存関係を一貫して管理するためにPoetryによって作成されます。一般的な習慣としては、poetry.lock ファイルをGitリポジトリに含めることが推奨されます。これにより、他の開発者や本番環境で同じ依存関係が使用されることが保証されます。

  5. .env ファイル: 環境変数を保持するファイルで、機密情報を含むことがあるため、Gitで追跡すべきではありません。

これらの除外項目を.gitignoreファイルに追加することで、不要なファイルがGitリポジトリに含まれることを防ぐことができます。例えば、以下のような内容を.gitignoreに追加できます。

# Poetryの仮想環境
.venv/

# Pythonキャッシュファイル
__pycache__/
*.pyc

# 環境変数
.env

この設定により、プロジェクトの重要な部分だけがGitリポジトリに含まれ、不要なファイルは除外されます。

.gitignore ファイルの変更を有効化するには、以下のステップを実行します。

ステップ1: .gitignore ファイルを編集

まず、.gitignore ファイルをエディタで開いて、必要な変更を加えます。変更が完了したらファイルを保存します。

ステップ2: 変更をGitに適用

  1. Gitインデックスの更新: .gitignore で指定したファイルが既にGitのインデックスに含まれている場合、それらをインデックスから削除する必要があります。これを行うには、Gitリポジトリのルートディレクトリで以下のコマンドを実行します。

    git rm -r --cached .
    

    このコマンドは、全てのファイルをインデックスから削除しますが、実際のファイルはそのまま残ります。このステップにより、.gitignore の変更が正しく適用されます。

  2. ファイルを再度追加: 続いて、ファイルを再度インデックスに追加します。

    git add .
    

    この時、.gitignore に指定されたファイルは無視されます。

  3. 変更をコミット: 最後に、変更をコミットします。

    git commit -m "Update .gitignore and apply changes"
    

ステップ3: 変更をリモートリポジトリにプッシュ(必要な場合)

リモートリポジトリがある場合は、変更をリモートにプッシュします。

git push

これにより、.gitignore ファイルの変更が有効化され、Gitリポジトリは.gitignore のルールに従ってファイルを追跡するようになります。

pipとpoetryの関係性は?

pipPoetryは、Pythonのパッケージ管理ツールですが、それぞれ異なるアプローチと機能を提供します。これらのツールの関係性を理解するには、それぞれの特徴と役割を考慮する必要があります。

pip

  • 役割: pipはPythonの標準的なパッケージ管理ツールで、Pythonパッケージをインストール、アップグレード、アンインストールするために広く使用されています。
  • 特徴:
    • PyPI(Python Package Index)から直接パッケージをインストール。
    • 依存関係の解決は行いますが、パッケージの依存関係を細かく管理する機能は限られています。
    • プロジェクト固有の依存関係管理は、requirements.txtファイルを通じて行われます。

Poetry

  • 役割: Poetryは依存関係の管理とパッケージの作成をより洗練された方法で行うツールで、仮想環境の管理も行います。
  • 特徴:
    • プロジェクトの依存関係をpyproject.tomlファイルで管理。
    • バージョン管理、依存関係の解決、パッケージの公開を簡単に行うことができます。
    • 仮想環境を自動的に作成・管理し、プロジェクトの依存関係を分離します。

関係性

  • pipはPythonパッケージのインストールに広く使用されており、Poetryも内部でpipを使用してパッケージをインストールしています。
  • Poetrypipよりも高度な依存関係管理とパッケージバージョニングを提供し、プロジェクトのセットアップとメンテナンスをより簡単にします。
  • pipは既にインストールされているパッケージを管理するのに便利ですが、Poetryはプロジェクト開始時のセットアップや依存関係の追加、仮想環境の管理に特に適しています。

結論

pipPoetryは補完的な関係にあります。pipはパッケージのインストールと基本的な依存関係の解決に優れていますが、Poetryはこれらの機能に加えて、依存関係のより洗練された管理、バージョニング、パッケージの公開などの機能を提供します。プロジェクトの要件に応じて、これらのツールを適切に選択・使用することが重要です。

Discussion