PEP 723 wrapper for linting Python scripts
Project description
pep723-loader
A CLI wrapper that auto-installs PEP 723 inline script dependencies before executing linters and other tools.
The Problem
Python scripts with PEP 723 inline metadata declare their dependencies directly in the file:
# /// script
# requires-python = ">=3.11"
# dependencies = [
# "requests>=2.31.0",
# "rich>=13.0.0",
# ]
# ///
import requests
from rich import print
# ...
But when you run type checkers or linters on these scripts, they fail because the dependencies aren't installed:
$ mypy script.py
script.py:8: error: Cannot find implementation or library stub for module named "requests"
script.py:9: error: Cannot find implementation or library stub for module named "rich"
The Solution
pep723-loader wraps your linter and automatically installs the inline dependencies first:
$ pep723-loader mypy script.py
# Dependencies installed, then mypy runs successfully
Installation
pip install pep723-loader
Or with uv:
uv tool install pep723-loader
Usage
Command Line
# Wrap any linter or tool
pep723-loader mypy script.py
pep723-loader basedpyright script.py
pep723-loader ruff check script.py
pep723-loader bandit script.py
# Pass any arguments through to the wrapped command
pep723-loader mypy --strict --warn-unreachable script.py
# Works with directories too
pep723-loader mypy scripts/
Pre-commit Integration
There are two ways to use pep723-loader with pre-commit:
Simple: If tools are already installed
First, add the tools to your project's dev dependencies:
uv add --dev pep723-loader mypy
Then configure the hook:
- repo: local
hooks:
- id: mypy
name: mypy
entry: pep723-loader mypy
language: system
types: [python]
pass_filenames: true
Recommended: Self-contained with uv
This approach keeps tools out of your project's dependencies - uv provides them on-demand:
- repo: local
hooks:
- id: mypy
name: mypy
entry: uv run -q --no-sync --with pep723-loader --with mypy pep723-loader mypy
language: system
types: [python]
pass_filenames: true
- id: basedpyright
name: basedpyright
entry: uv run -q --no-sync --with pep723-loader --with basedpyright pep723-loader basedpyright
language: system
types: [python]
pass_filenames: true
What do these flags do?
| Flag | Purpose |
|---|---|
-q |
Quiet mode - suppresses uv's output so only linter output is shown |
--no-sync |
Skip syncing the project's dependencies - faster, we only need the tools |
--with <pkg> |
Temporarily add a package for this invocation |
The --with packages are ephemeral - they're not installed into your project's virtualenv. However, they're cached by uv, so after the first run there's no download overhead.
How It Works
- Scans Python files passed as arguments for PEP 723
# /// scriptmetadata blocks - Extracts dependencies using
uv export --script - Installs dependencies via
uv pip install - Executes the wrapped command with all original arguments
- Propagates the wrapped command's exit code
Requirements
- Python 3.10+
- uv (used for dependency extraction and installation)
Related Projects
- pep723-uv-interpreter - VS Code extension that automatically sets the Python interpreter for PEP 723 scripts, enabling auto-completion and intellisense in your editor.
These tools are complementary: pep723-uv-interpreter solves the IDE experience, while pep723-loader solves CI/pre-commit linting.
License
Apache License 2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pep723_loader-0.7.0.tar.gz.
File metadata
- Download URL: pep723_loader-0.7.0.tar.gz
- Upload date:
- Size: 25.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f650f2398f4d2e3b72f46171b35548ec4bfbf1acd3de2cc07dbac0815ff6c14
|
|
| MD5 |
eff28f470399a6d25c04a574f4fa1008
|
|
| BLAKE2b-256 |
7863d15f1dc7d3f997432fba3d4325861f396d46b509c2aa7e358bb0c4f141c1
|
File details
Details for the file pep723_loader-0.7.0-py3-none-any.whl.
File metadata
- Download URL: pep723_loader-0.7.0-py3-none-any.whl
- Upload date:
- Size: 27.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c396c899bba6d53196a752ad3713d3eb98f5060b48ecdddea9ca69711d9ddb48
|
|
| MD5 |
7100215d399bf52c8129d31245a7f309
|
|
| BLAKE2b-256 |
ef309708bbfd46b70c69f3bd52881c1f251249d7782f96573ecd9c4d60f02929
|