How to run Python scripts¶
The run
command supports executing Python scripts with inline metadata, such that a dedicated environment is automatically created with the required dependencies and with the correct version of Python.
A script metadata block is a comment block that starts with # /// script
and ends with # ///
. Every line between those two lines must be a comment line that starts with #
and contains a TOML document when the comment characters are removed.
The top-level fields are:
dependencies
: A list of strings that specifies the runtime dependencies of the script. Each entry must be a valid dependency specifier.requires-python
: A string that specifies the Python version(s) with which the script is compatible. The value of this field must be a valid version specifier.
The following is an example of Python script with a valid metadata block:
# /// script
# requires-python = ">=3.11"
# dependencies = [
# "httpx",
# "rich",
# ]
# ///
import httpx
from rich.pretty import pprint
resp = httpx.get("https://peps.python.org/api/peps.json")
data = resp.json()
pprint([(k, v["title"]) for k, v in data.items()][:10])
Run it directly:
$ hatch run /path/to/script.py
Creating environment: SyB4bPbL
Checking dependencies
Syncing dependencies
[
│ ('1', 'PEP Purpose and Guidelines'),
│ ('2', 'Procedure for Adding New Modules'),
│ ('3', 'Guidelines for Handling Bug Reports'),
│ ('4', 'Deprecation of Standard Modules'),
│ ('5', 'Guidelines for Language Evolution'),
│ ('6', 'Bug Fix Releases'),
│ ('7', 'Style Guide for C Code'),
│ ('8', 'Style Guide for Python Code'),
│ ('9', 'Sample Plaintext PEP Template'),
│ ('10', 'Voting Guidelines')
]
notes
- The informational text in this example is only temporarily shown in your terminal on the first run.
- Although the environment name is based on the script's absolute path, the command line argument does not have to be.
Environment configuration¶
You may use the [tool.hatch]
table directly to control the script's environment. For example, if you wanted to disable UV (which is enabled by default for scripts), you could add the following:
# /// script
# ...
# [tool.hatch]
# installer = "pip"
# ///