PEP 723 というものがあることをつい先日知って、驚愕しました。
上の記事だけでも呼んでくれると、その凄さを実感できると思います。
依存関係の共有方法
Python コードを共有する際、「このライブラリに依存しているよ!」ということを伝えないと python test.py でエラーを見ることになります。多分うんざりするほど見ていると思います。
これを解決する方法がいくつかあります。
requiements.txt/venv
requirements.txt を定義しておき、pip install -r requirements.txt とすることで、必要なライブラリを導入することが出来ます。
現在は既に非推奨かと思いますが、グローバルの環境でこれをやると、後々バージョンの衝突(ライブラリ B を動かすにはライブラリ A のバージョン 1.x 未満である必要があるが、ライブラリ C を動かすにはライブラリ A のバージョン 2.0 以上である必要がある)が起きます。
venv というものを用いることで、プロジェクト(特定ディレクトリ配下で~といったイメージ)に仮想環境として環境を分けて利用が可能です。
Poetry/Rye
共にパッケージ管理ツールと呼ばれるもので、venv をより進化させたようなものです。
プロジェクトごとに依存関係を整理する場合に非常に強力で、下記で比較を行ってくれています。
PEP 723(Inline script metadata) による依存関係の共有
本題です。もしあなたの環境に uv/pipx が入っているのであれば、これが使えると思います。
ソースコードに依存関係を書いてしまおう!というものです。
# /// script
# requires-python = ">=3.10"
# dependencies = [
# "cowsay",
# ]
# ///
import cowsay
def main():
message = "PEP 723 is awesome!\nNo manual pip install needed."
cowsay.tux(message)
if __name__ == "__main__":
main()
これで動きます。
$ uv run test.py
Installed 1 package in 5ms
_____________________________
/ \
| PEP 723 is awesome! |
| No manual pip install needed. |
\ /
=============================
\
\
\
.--.
|o_o |
|:_/ |
// \ \
(| | )
/'\_ _/`\
\___)=(___/
流石にプロジェクトにおいて利用するには向いてないと思います。一方で、スクリプト単体を共有する、別のプログラミング言語で開発しているプロジェクトにおいて、部分的に Python によるスクリプトを採用する、といったケースでは有用です。
まとめ
- PEP 723 にてソースコードに依存関係の記述が可能に(デモとしては用意しませんでしたが、勿論ライブラリのバージョン指定も可能です)
- 「プロジェクト単位で依存関係を共有する」よりは「スクリプト単位で依存関係を共有する」
- 事前処理は不要で
uv run script.pyでライブラリのインストールから実行までやってくれます