pex のオーバーヘッドなしに Pants 管理の Python ファイルを実行する¶
pants run my_script.py
で Pants で管理している Python ファイルを実行すると、実行ごとに sandbox 環境が構築されるため実行までに時間がかかる。特に PyTorch のような大きいパッケージを含むモジュールがあると、実行までに 10 分かかることもある。この問題を解決するために、venv
環境を事前に作成しておき、その環境で実行する方法を紹介する。
venv 環境の構築¶
まず、venv
環境を構築する。Pants にはresolve
という概念があり、Python パッケージ管理ツールでいう group のようなものになる。1 つのレポジトリで複数のresolve
を持つことができる。プログラム実行の resolve を venv に落とし込むことで、実行時に sandbox 環境を構築する時間を削減できる。 pants export
コマンドで resolve に対応したvenv
環境を構築できる。しかし、多くのパッケージが含まれる場合、完了までに時間がかかる。そのため、uv
を使って環境構築することで効率的に作業を進めることができる。
実行¶
Pants には root という概念があり、これは Python の import path を設定するようなものになる。pants run
コマンドでうまく実行できていた Python ファイルが、venv
環境を使って実行すると module が見つからずにエラーが発生することがある。その場合、import path を設定して解決する。
pants roots
コマンドで root を確認し、import path に追加する。
上記のように shell で設定するか、Python ファイルの冒頭に次のように記述することで、Python 環境で import がうまくいくようになる。
この状態でvenv
環境を使って Python ファイルを実行すると、pex のオーバーヘッドなしに実行できる。
この方法で resolve ごとにvenv
環境を構築しておくことで、複数の環境でプログラム実行ができる。例えば CPU/GPU 環境の切り替えや、Python のバージョン切り替えなどが即時可能になる。