コンテンツにスキップ

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を使って環境構築することで効率的に作業を進めることができる。

1
2
3
4
5
# 複数の resolve があることを想定して出力先を指定
uv venv $resolve_name
# resolveに対応するrequirements.txtを指定。
# pexにはlockfileからrequirements.txt形式でパッケージの依存関係を出力する機能がある
uv install -r requirements.txt

実行

Pants には root という概念があり、これは Python の import path を設定するようなものになる。pants runコマンドでうまく実行できていた Python ファイルが、venv環境を使って実行すると module が見つからずにエラーが発生することがある。その場合、import path を設定して解決する。

pants rootsコマンドで root を確認し、import path に追加する。

export PYTHONPATH="/path/to/module:$PYTHONPATH"

上記のように shell で設定するか、Python ファイルの冒頭に次のように記述することで、Python 環境で import がうまくいくようになる。

import sys
sys.path.append("/path/to/module")

この状態でvenv環境を使って Python ファイルを実行すると、pex のオーバーヘッドなしに実行できる。

./venv/bin/python my_script.py

この方法で resolve ごとにvenv環境を構築しておくことで、複数の環境でプログラム実行ができる。例えば CPU/GPU 環境の切り替えや、Python のバージョン切り替えなどが即時可能になる。