Python 3.12でのパッケージング手法の変更


Python 3.12におけるパッケージングの変更と pandas_datareader のインストール問題

Python 3.12では、パッケージングシステムに大きな変更が加えられました。これにより、一部のライブラリのインストールに影響が出ています。特に pandas_datareader のインストール時に遭遇する可能性のあるエラーと、その解決方法について説明します。

pandas_datareader のインストール問題

Python 3.12で pandas_datareader をインストールしようとすると、以下のようなエラーが発生する可能性があります:

ModuleNotFoundError: No module named 'distutils'

このエラーは、Python 3.12で setuptools が必要になったことが原因です。setuptools は以前は distutils モジュールに依存していましたが、Python 3.12ではこのモジュールが削除されました1

解決方法

この問題を解決するには、以下の手順を試してください:

  1. setuptools を最新版にアップグレードする:
pip install --upgrade setuptools
  1. pandas_datareader をインストールする:
pip install pandas_datareader

Numpy のビルドシステム変更

Python 3.12では、Numpy のようなライブラリでもビルドシステムの変更が行われています。Numpy は Python 3.12 でデフォルトのビルドシステムを meson build system に移行しました2。これにより、setuptools の使用は非推奨となり、将来的には廃止される予定です。

pyproject.toml の推奨

パッケージングで pyproject.toml が強く推奨されている理由の一つは、このようなビルドシステムの変更に対応するためです。pyproject.toml を使用することで、プロジェクトのビルドシステムやその依存関係を明確に指定できます。

以下は pyproject.toml の簡単な例です:

[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "example_project"
version = "0.1.0"
description = "An example project"
dependencies = [
    "pandas",
    "numpy",
]

[project.scripts]
my-script = "example_project.cli:main"

console_scripts と名前空間

pyproject.toml の [project.scripts] セクション(または setup.py の entry_points)で指定される console_scripts は、モジュールパスとコロンで区切られた関数名を使用します。

例えば、example_project.cli:mainexample_project/cli.py ファイル内の main() 関数を指しています。

この指定方法はクラス定義内のメソッドにも適用できます。例えば:

class CLI:
    @staticmethod
    def main():
        print("Hello from CLI!")

この場合、pyproject.toml では以下のように指定できます:

[project.scripts]
my-script = "example_project.cli:CLI.main"