現在お買い物カゴには何も入っていません。
タグ: pyproject.toml
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。
解決方法
この問題を解決するには、以下の手順を試してください:
- setuptools を最新版にアップグレードする:
pip install --upgrade setuptools
- 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:main
はexample_project/cli.py
ファイル内のmain()
関数を指しています。この指定方法はクラス定義内のメソッドにも適用できます。例えば:
class CLI: @staticmethod def main(): print("Hello from CLI!")
この場合、pyproject.toml では以下のように指定できます:
[project.scripts] my-script = "example_project.cli:CLI.main"
Pythonのパッケージの作成と登録
setup.pyとpyproject.tomlの関係
setup.pyとpyproject.tomlの役割
setup.py
は長い間、Pythonパッケージのビルドと配布のための標準的な設定ファイルとして使用されてきました。しかし、近年ではpyproject.toml
が推奨されています。pyproject.toml
は、パッケージングツールやその他のツールの設定を一元管理するためのファイルです。pyproject.tomlの利点
-
ツールの統一:
pyproject.toml
は、ビルドシステムの依存関係やプロジェクトのメタデータを一つのファイルにまとめることができます。これにより、プロジェクトの設定が一元化され、管理が容易になります。 -
ビルドシステムの宣言:
[build-system]
テーブルを使用して、プロジェクトのビルドに必要なツールや依存関係を明示的に宣言できます。これにより、ビルド環境の再現性が向上します。 -
ツール間の互換性:
pyproject.toml
は、setuptools
、poetry
、flit
などの異なるビルドツールと互換性があります。これにより、特定のツールに依存せずにプロジェクトを管理できます。
setup.pyは不要か?
新しいプロジェクトでは、
pyproject.toml
を使用することが強く推奨されています。特に、ビルド中にカスタムスクリプトを実行する必要がない場合、setup.py
は最小限のスタブとしてのみ使用されるべきです。具体的には、以下のように最小限のsetup.py
を使用できます:# setup.py import setuptools setuptools.setup()
具体的な設定例
以下に、
pyproject.toml
の具体的な設定例を示します:[build-system] requires = ["setuptools", "wheel"] build-backend = "setuptools.build_meta" [project] name = "your-package-name" version = "0.1.0" description = "A short description of your package" authors = [ { name = "Your Name", email = "your.email@example.com" } ] dependencies = [ "requests >= 2.0.0", "numpy >= 1.18.0" ] [tool.black] line-length = 88
PyPIへのパッケージ登録手順
-
TestPyPIでのテスト:
- TestPyPIにアカウントを作成し、APIトークンを取得します。
- パッケージをビルドし、TestPyPIにアップロードしてテストします。
-
APIトークンの取得:
- PyPI(またはTestPyPI)のアカウント設定からAPIトークンを生成します。
-
.pypircファイルの設定:
- ホームディレクトリに
.pypirc
ファイルを作成し、以下のように設定します:
- ホームディレクトリに
[distutils] index-servers = pypi testpypi [pypi] username = __token__ password = <Your-PyPI-API-token> [testpypi] username = __token__ password = <Your-TestPyPI-API-token>
- パッケージのビルドとアップロード:
python -m build
コマンドでパッケージをビルドします。python -m twine upload --repository testpypi dist/*
でTestPyPIにアップロードします。- テストが成功したら、
python -m twine upload dist/*
で本番のPyPIにアップロードします。
まとめ
最新の情報では、
pyproject.toml
が推奨されています。特に新しいプロジェクトでは、pyproject.toml
を使用することで、設定の一元管理やビルド環境の再現性が向上します。setup.py
は最小限のスタブとして使用し、主要な設定はpyproject.toml
に記述することが推奨されます。Citations:
[1] Pythonで自作ライブラリを作るとき、setup.pyに代えてpyproject.tomlを使ってみませんか?
[2] pyproject.toml を書く
[3] Should pyproject.toml configs always be required to use poetry? #3443
[4] Should I be using only pyproject.toml? [closed]
[5] pyproject.toml specification-