Skip to main content

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

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

  1. Scans Python files passed as arguments for PEP 723 # /// script metadata blocks
  2. Extracts dependencies using uv export --script
  3. Installs dependencies via uv pip install
  4. Executes the wrapped command with all original arguments
  5. Propagates the wrapped command's exit code

Requirements

  • Python 3.10+
  • uv (used for dependency extraction and installation)
  • 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

Metadata

Release files for pep723-loader 0.12.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pep723-loader 0.12.0
File Size Uploaded
pep723_loader-0.12.0.tar.gz 25.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pep723-loader 0.12.0
File Interpreter ABI Platform
pep723_loader-0.12.0-py3-none-any.whl Python 3 none any Details

Total release size: 53.1 kB

Release files / pep723_loader-0.12.0.tar.gz

Download URL pep723_loader-0.12.0.tar.gz
Size 25.6 kB
Tags Source
SHA-256 checksum
How to use checksums
f31f63df00df7ea4f6b7258c24c531ad31715d92253ee9297b03b701c52407f1
BLAKE2b-256 checksum
How to use checksums
122ed8cb964c3fde5ee994b11d795ed02e67807f1a094797f859ce33ac53d9d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"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}

Release files / pep723_loader-0.12.0-py3-none-any.whl

Download URL pep723_loader-0.12.0-py3-none-any.whl
Size 27.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f2c5b2f1ce991615244f42d0855828dca917f4fee3a3a35e06bd61b713ab321f
BLAKE2b-256 checksum
How to use checksums
7288583a36e89a8e298afa09096f199608f2a383de2b1d41c3eb02576472f733
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"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}

Release history Release notifications | RSS feed

This release

0.12.0 This release

2 release files

0.11.0

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page