HatchでスタンドアロンのPythonスクリプトを実行する#

Pythonは、スクリプトのインラインメタデータをサポートしています( 2024年に追加された機能)。これにより、依存関係とPythonバージョンを自動的に管理するスタンドアロンスクリプトを実行できます。

PDM、[Hatch ]( get - to - know - hatch )、{term} uvなど、多くのツールがこのワークフローをサポートしています。このチュートリアルでは、HatchとUVに焦点を当てます。同じメタデータ形式を他のツールで使用することもできます。

再現可能なスクリプトの作成方法#

完全な{term}「Pythonパッケージ」を作成せずに単一のスクリプトを共有または実行したい場合があります。これを行うには、インラインスクリプトメタデータを使用できます。この形式では、コメントブロック内のスクリプトの上部に依存関係とPythonのバージョンを指定できます。

スクリプトの上部にメタデータを追加すると、Hatch (またはPDMまたはUV )はそのメタデータを使用して次のことを行います。

  • Create an isolated virtual Python environment for that script.

  • スクリプトに記載されている{term} 依存関係をその環境にインストールします。

  • メタデータで指定した必要なPythonバージョンを使用します。

このアプローチは、再現可能にしたいが、完全なPythonパッケージになる必要のないワークフローに役立ちます。

Why use Hatch for scripts?#

インラインメタデータは、スクリプトを再現可能にするのに役立ちます。新しい環境を手動で作成したり、必要な依存関係を推測したりすることなく、誰でもスクリプトを実行できます。Hatchは、依存関係のインストールと正しいPythonバージョンの使用を担当します。

スクリプトにインラインメタデータを追加する方法#

この例ではHatchを使用しますが、好みのツールであればUVを使用することもできます。

まず、上部に以下のブロックを持つ「script.py」という名前の新しいファイルを作成します。メタデータブロックは'#/// script で始まり、'#////'で終わります。その間のすべては、コメントとして書かれた{term} TOML 'メタデータでなければなりません。

以下の例では、スクリプトにはPython 3.11以降が必要であり、NumPyは依存関係として宣言されています。

# /// script
# requires-python = ">=3.11"
# dependencies = [
#   "numpy",
# ]
# ///

import numpy as np

temperatures_c = np.array([12.4, 13.1, 14.8, 15.2, 16.0, 14.4, 13.7])
mean_temp = np.mean(temperatures_c)
anomalies = temperatures_c - mean_temp

print(f"Mean temperature: {mean_temp:.2f} C")
print("Temperature anomalies:", np.round(anomalies, 2))

Hatchでスクリプトを実行する#

ターミナルを開き、script.pyが存在するディレクトリに変更します。次に次を実行します。

hatch run script.py

最初の実行時に、Hatchは環境を作成し、依存関係をインストールします。後で実行すると、Hatchはその環境を再利用するため、起動が速くなります。

注釈

環境名は、スクリプトパスに基づいています。スクリプトを新しい場所に移動すると、Hatchは新しいスクリプト環境として扱います。

オプション:スクリプト環境の動作を構成する#

同じメタデータブロック内のスクリプト固有のハッチ動作を制御できます。たとえば、インストーラとして'uv'の代わりにpipを使用するには、次のようにします。

# /// script
# requires-python = ">=3.11"
# dependencies = ["numpy"]
#
# [tool.hatch]
# installer = "pip"
# ///

UVで同じスクリプトを実行する

UVを好む場合は、次のように同じインラインメタデータスクリプトを実行できます。

uv run script.py

同じ'#/// script メタデータブロックは、 requires - python 'や' dependencies `などのuvで動作します。

Uvを使用してスクリプトを実行する方法の詳細については、Running scripts with uv のガイドを参照してください。

スクリプトを使用する場合とパッケージを使用する場合#

パッケージを作成するのではなく、スクリプトを使用するタイミングを考えているかもしれません。

これはユースケースによって異なります。スクリプトは、次のような場合に役立つことがよくあります。

  • 小さなタスクが1つある、または一般化できない特定のワークフローがある。

  • ワークフローはまだ進化していますが、再現可能な環境で実行したいと考えています。

  • 再現性のある依存関係をすばやく必要としています。

  • コラボレーターと1つのファイルを共有しています。

Create a full package when:

  • 複数のプロジェクト用に再利用可能なモジュールを構築しています。

  • テスト、ドキュメント、リリース、長期メンテナンスが必要です。

  • コードベースは、1つまたは2つのスクリプトを超えて拡大しています。