1. 説明
- パート 1: Python パッケージ: Data People の入門 (パート 1/2) では、 Python モジュール、Python パッケージの基本、およびモジュールを独自のプロジェクトにインポートする方法について説明します。
- パート 2: Python パッケージ: データ担当者のための入門 (パート 2/2) では、依存関係管理と仮想環境について紹介します。
- パート 3: Python プロジェクトを構築するためのベスト プラクティスでは、プロジェクトを構築するための 9 つのベスト プラクティスと例について説明します。
- パート 4: Python プロジェクトから Dagster パイプラインまで、Dagster プロジェクトとデータ資産のセットアップの主要な概念を検討しました。
- 第 5 回: 環境変数 Python において、環境変数の重要性とその使用方法を紹介します。
- パート 6: 型ヒント、または型ヒントがエラーを減らす方法。
- パート 7: ファクトリパターン、または学習設計パターンは、ソフトウェア設計における一般的な問題に対する再利用可能な解決策です。
より大規模で複雑なパッケージを構築する場合、多くの場合、プロジェクト内の他のパッケージのコードを使用する必要があります。ここで依存関係の管理が重要になります。
今日は Python における依存関係管理がどのようなものであるかについて話しましょう。新旧のメソッドを使用して Python パッケージを管理する方法、さまざまな依存関係管理ツール、仮想環境を使用してパッケージを管理する方法まで、すべてを取り上げます。
目次
- 依存関係を管理する
- 従来の方法で依存関係を管理する: setup.py
- 依存関係を管理する新しい方法: pyproject.toml
- 「エクストラ」をインストールする
- 代替の Python 依存関係管理ツール
- 仮想環境
2. 依存関係を管理する
依存関係は、パッケージが適切に動作するために依存する他のパッケージです。依存関係を追跡するのは難しい場合がありますが、依存関係を効果的に管理するためのツールがあります。
そのようなツールの 1 つは、オープン ソース Python パッケージの中央リポジトリである Python Package Index (PyPI) です。PyPI を使用して、プロジェクトに含めることができるパッケージを検索し、パッケージを他の人が利用できるようにすることができます。
次のセクションでは、Python プロジェクトで依存関係を管理する 2 つの異なる方法、つまり古い方法と新しい方法について説明します。setup.py
pyproject.toml
2.1 従来の方法で依存関係を管理する:setup.py
導入前は、ファイルを使用して Python プロジェクトの依存関係を管理するアプローチが推奨されていました。pyproject.toml
setup.py
setup.py
プロジェクトのルート ディレクトリに含まれるファイルで、パッケージとその依存関係に関する情報が含まれています。このファイルは、パッケージとその依存関係をインストールするためにpip (Python のパッケージ インストーラー)によって使用されます 。
ファイルの例を次に示します。setup.py
from setuptools import setup, find_packages
setup(
name='your-package-name',
version='0.0.1',
description='A brief description of your package',
author='Your Name',
author_email='[email protected]',
packages=find_packages(),
install_requires=[
'dependency1',
'dependency2',
],
)
- および は、パッケージの名前とバージョンを指定する必須フィールドです。
name
version
- このフィールドには、パッケージの簡単な説明が表示されます。
description
- およびフィールドには、パッケージの責任者の名前と電子メール アドレスを指定します。このフィールドは、プロジェクトに含まれるパッケージを指定します。この関数は、プロジェクト内のすべてのパッケージを自動的に検索するために使用されます。
author
author_email
packages
find_packages()
- このフィールドは、パッケージが適切に機能するために必要な依存関係のリストです。この例では、パッケージは他の 2 つのパッケージ、dependency1 と dependency2 に依存しています。
install_requires
パッケージの依存関係をインストールするには、次のコマンドを実行できます。
pip install -e .
このオプションは、pip に「編集可能な」インストールを実行するように指示します。これにより、パッケージを再インストールせずに変更を加えることができます。コマンドの最後に現在のディレクトリ (パッケージのルート ディレクトリ) を指定します。-e
.
上記のコマンドを実行すると、pip によってグローバル環境に依存関係がインストールされるため、複数のプロジェクトで作業している場合に問題が発生する可能性 があることに注意することが重要です。この問題は仮想環境で解決されます。これについてはこの記事で後ほど説明します。
2.2 依存関係を管理する新しい方法:pyproject.toml
pyproject.toml
は、Python プロジェクトの依存関係を管理するための setup.py に代わる新しいファイル形式です。これは PEP 518 および PEP 621 の一部として導入されました。
これは、パッケージとその依存関係をインストールするために pip が使用する構成ファイルです。それに比べて、形式がシンプルで、読みやすく、保守しやすいです。setup.py
pyproject.toml ファイルの例を次に示します。
[project]
name = "your-package-name"
version = "0.0.1"
description = "A brief description of your package"
authors = ["Your Name <[email protected]>"]
[project.dependencies]
dependency1 = "^1.0"
dependency2 = "^2.0"
- および フィールドは必須であり、パッケージの名前とバージョンを指定します。
name
version
- このフィールドには、パッケージの簡単な説明が表示されます。
description
- このフィールドには、パッケージの責任者の名前と電子メール アドレスを指定します。
authors
- このセクションでは、パッケージが適切に機能するために必要な依存関係を指定します。この例では、パッケージは他の 2 つのパッケージと に依存しています。
dependencies
dependency1
dependency2
上で説明したように、次のコマンドを実行して編集可能なインストールを実行できます。
pip install -e .
2.3 「追加機能」をインストールする
「エクストラ」と呼ばれる追加の依存関係を必要とするオプション機能がパッケージに含まれている場合に何が起こるかについて話しましょう。
このファイルを使用して依存関係を管理する場合、追加の項目を関数の引数に含めることで指定できます。例えば:setup.py
extras_require
setup()
setup(
...
extras_require={
'extra_feature': ['dependency3', 'dependency4']
}
...
)
追加の依存関係をインストールするには、次のコマンドを実行します。
pip install -e .[extra_feature]
そのファイルを使用している場合は、ファイルのセクションに追加のコンテンツを指定できます。例えば:pyproject.toml
[project.extras]
[project.extras]
extra_feature = ["dependency3", "dependency4"]
次のように、同じコマンドを使用して追加の依存関係をインストールできます。
pip install -e .[extra_feature]
前述したように、このフラグは「編集可能」を表し、パッケージを「開発者モード」でインストールします。新しいバージョンをリリースする前に変更をテストしたい場合にこれを使用できます。-e
このフラグはフラグに似ていますが、「dev」アドオンを使用してパッケージをインストールする必要があることも指定します。パッケージ ファイル内で「dev」として指定されている他のパッケージまたは依存関係もインストールされます。これは、運用環境での使用には必要のない開発固有の依存関係をインストールする場合に役立ちます。-e .[dev]
-e
setup.py
3. Python依存関係管理ツールの置き換え
pip に加えて、Python プロジェクトの依存関係を管理するための代替ツールがあります。そのようなツールの 1 つが詩です。
Poetry は、Python プロジェクトのパッケージ化および依存関係管理ツールです。Poetry は、バージョン制約の解決や自動仮想環境管理などの機能を備え、pip よりも使いやすいように設計されています。
詩を使用する主な利点の 1 つは、そのシンプルさと使いやすさです。Poetry はプロジェクトの仮想環境を自動的に管理し、各プロジェクトに独自の隔離された環境とその依存関係が確実に存在するようにします。これにより、異なるプロジェクト間でバージョンが競合するリスクが軽減されます。さらに、Poetry は、ファイル内の依存関係とバージョン制約を指定するためのシンプルで簡潔な構文を提供します。pyproject.toml
ただし、詩を使用することにはいくつかの欠点があります。まず、pip ほど広く使用されておらず、広範な Python コミュニティ内で十分にサポートされていない可能性があります。一部の開発者は、pip が提供する、より柔軟でカスタマイズ可能なアプローチを好む場合があります。
4. 仮想環境 (「venvs」とも呼ばれます)
Python の仮想環境は、依存関係の競合の問題に対する解決策を提供します。デフォルトでは、すべての Python パッケージは単一のグローバル名前空間にインストールされるため、単一マシン上の異なるプロジェクト間で互換性の問題が発生し、競合の解決が困難になる可能性があります。
仮想環境は分離された Python 環境を作成し、異なるバージョンの Python とライブラリを相互に干渉することなく個別のプロジェクトで使用できるようにします。
これは、相互に干渉することなく、それぞれに独自のパッケージのセットを持つ複数の仮想環境を同じマシン上に構築できることを意味します。
新しい仮想環境を作成するには、このコマンドを使用できます。たとえば、「myenv」という名前の環境を作成するには、次のコマンドを実行します。python -m venv
python -m venv myenv
5. 注: Python またはpython3
複数のバージョンの Python がインストールされている場合、または Python 2 を使用する古いコードを使用している場合は、使用している Python のバージョンを明示的に参照するコマンドを使用する必要があります。
たとえば、コンピューターに Python 3 が新しくインストールされており、デフォルトで Python 3 を使用している場合、これを明示的に指定する必要はありません。これらのいずれかを使用することも、両方とも Python 3 を参照しているため、使用することもできます。python3
python3
python
ただし、Python 2 のコード ライブラリを使用する必要があるが、Python 2 と 3 がインストールされている場合は、 を使用すると、コードを中断することなく作業を続けることができます。python
pip を使用してパッケージをインストールする場合も、同じロジックが適用されます。pip
pip3
仮想環境をアクティブにするには、コマンドの後に環境スクリプトへのパスを指定します。source
activate
Linux および macOS では、次を実行します。
source myenv/bin/activate
Windows では、次を実行します。
myenv\Scripts\activate
環境がアクティブ化された後、実行される Python スクリプトまたはコマンドは、システムのグローバル バージョンではなく、virtualenv 内の Python バージョンとライブラリを使用します。
仮想環境を非アクティブにするには、ターミナルを入力するだけです。deactivate
仮想環境をアクティブ化すると、コマンド ライン プロンプトがアクティブなvenvを示すように変更されることがわかります 。
myname@mymachine myProject % source myenv/bin/activate
(myenv) myname@mymachine myProject % deactivate
myname@mymachine myProject %
ベスト プラクティスは、新しいプロジェクトごとに特定の仮想環境を作成し、それをプロジェクトと同じディレクトリに保存することです。これにより管理が容易になり、すべての依存関係がプロジェクト フォルダーに確実に含まれるようになります。
仮想環境が Git リポジトリ内にある場合は、それをファイルに追加することをお勧めします。これにより、リポジトリをクリーンな状態に保ち、各開発者の仮想環境を GitHub リポジトリから確実に分離できます。.gitignore