CLI framework for building command-line interfaces from Python functions, classes, and class instances
Project description
Interfacy
Interfacy is a CLI framework that turns Python functions, classes, and class instances into command-line interfaces. It derives the CLI from signatures, type annotations, and docstrings instead of making you define it twice.
Features
- Generate CLIs from functions, classes, class methods, and class instances.
- Nested subcommands and manual command groups with aliases.
- Type-driven parsing from annotations, with support for custom parsers.
- Model expansion for dataclasses, Pydantic models, and plain classes.
--helptext generated from docstrings.- Highly customizable help output with multiple layouts, color themes, and configurable ordering.
- Stdin piping support with configurable routing to parameters.
- Optional tab completion via
argcomplete.
Installation
From PyPI
pip install interfacy
uv add interfacy
From source
pip install git+https://github.com/zigai/interfacy.git
uv add "git+https://github.com/zigai/interfacy.git"
First CLI
from interfacy import Argparser
def greet(name: str, times: int = 1) -> str:
"""Return a greeting."""
return " ".join([f"Hello, {name}!" for _ in range(times)])
if __name__ == "__main__":
Argparser(print_result=True).run(greet)
$ python app.py Ada
Hello, Ada!
$ python app.py Ada --times 2
Hello, Ada! Hello, Ada!
By default, required non-boolean parameters become positional arguments and optional parameters become flags.
Class-Based Commands
Classes become command namespaces. __init__ parameters live at the command level and public methods become subcommands.
from interfacy import Argparser
class Calculator:
def __init__(self, precision: int = 2) -> None:
self.precision = precision
def add(self, a: float, b: float) -> float:
return round(a + b, self.precision)
def mul(self, a: float, b: float) -> float:
return round(a * b, self.precision)
if __name__ == "__main__":
Argparser(print_result=True).run(Calculator)
$ python app.py --precision 3 add 1.2345 2.3445
3.579
Structured Parameters
Dataclasses, Pydantic models, and plain classes with typed __init__ parameters can be expanded into nested flags and reconstructed before execution.
from dataclasses import dataclass
from interfacy import Argparser
@dataclass
class Address:
city: str
postal_code: int
@dataclass
class User:
name: str
age: int
address: Address | None = None
def greet(user: User) -> str:
return f"Hello {user.name}, age {user.age}"
if __name__ == "__main__":
Argparser(print_result=True).run(greet)
$ python app.py --user.name Ada --user.age 32
Hello Ada, age 32
Manual Groups
Use CommandGroup when your command tree is not naturally rooted in one callable:
from interfacy import Argparser, CommandGroup
def clone(url: str) -> str:
return f"clone:{url}"
class Releases:
def cut(self, version: str) -> str:
return f"cut:{version}"
ops = CommandGroup("ops", description="Operational commands")
ops.add_command(clone)
ops.add_command(Releases)
if __name__ == "__main__":
Argparser(print_result=True).run(ops)
Interfacy CLI Entrypoint
Interfacy also ships a CLI that can run an existing function, class, or class instance directly from a module or Python file:
$ interfacy app.py:greet Ada
$ interfacy app.py:greet --help
$ interfacy package.cli:Calculator add 1 2
The entrypoint supports configuration via TOML, loaded from ~/.config/interfacy/config.toml or INTERFACY_CONFIG.
usage: interfacy [--help] [--version] [--config-paths] [TARGET] ...
Interfacy is a CLI framework for building command-line interfaces from Python callables.
positional arguments:
TARGET Python file or module with a function/class/instance symbol (e.g. main.py:main, pkg.cli:App, pkg.cli:service).
ARGS Arguments passed through to the target command.
options:
--help show this help message and exit
--version show version and exit.
--config-paths print config file search paths and exit.
Use 'interfacy TARGET --help' to display the help text for the target.
License
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 interfacy-0.4.10.tar.gz.
File metadata
- Download URL: interfacy-0.4.10.tar.gz
- Upload date:
- Size: 411.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d0989bf7f89eb4641830fa37f5778ae5a2f98617860edaa25432709c31c7392
|
|
| MD5 |
b5c40654a3ea69794241ddd4aaabe72b
|
|
| BLAKE2b-256 |
537ea414a5666efcf907d1577849ec836c67f3adcdca50f08ab9f01a8a4a5623
|
File details
Details for the file interfacy-0.4.10-py3-none-any.whl.
File metadata
- Download URL: interfacy-0.4.10-py3-none-any.whl
- Upload date:
- Size: 127.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e38e339b7922ab4d2a9a850c74be64b22c0e01bd0d9ebe6a1dae3a4f4ad1b4d0
|
|
| MD5 |
cf5983dd0d7f4c1aea2e573bf0974047
|
|
| BLAKE2b-256 |
9d325881e2bb721c4e33120eafab07a58fc62d82b53f5526212dded85215238a
|