Skip to main content

CLI framework for building command-line interfaces from Python functions, classes, and class instances

Project description

Interfacy

Tests PyPI version Supported versions Downloads license

Interfacy is a CLI framework for building command-line interfaces from Python functions, classes, and class instances using type annotations and docstrings.

Features

  • Generate CLIs from functions, class methods, or class instances.
  • Nested subcommands and command groups with aliases.
  • Type inference from annotations, with support for custom parsers.
  • --help text generated from docstrings.
  • Run a target callable directly from the CLI (e.g. interfacy path.py:main).
  • Multiple help layouts and color themes.
  • Optional class initializer arguments exposed as CLI options.
  • Argparse-compatible backend, including a drop-in ArgumentParser replacement.
  • 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"

Quick start

from interfacy import Argparser

def greet(name: str, times: int = 1) -> None:
    for _ in range(times):
        print(f"Hello, {name}!")

if __name__ == "__main__":
    Argparser().run(greet)

Classes as flags

from dataclasses import dataclass
from interfacy import Argparser

@dataclass
class Address:
    """Mailing address data for a user.

    Args:
        city: City name.
        zip: Postal or ZIP code.
    """
    city: str
    zip: int

@dataclass
class User:
    """User profile information for the CLI.

    Args:
        name: Display name.
        age: Age in years.
        address: Optional mailing address details.
    """
    name: str
    age: int
    address: Address | None = None

def greet(user: User) -> str:
    if user.address is None:
        return f"Hello {user.name}, age {user.age}"
    return f"Hello {user.name}, age {user.age} from {user.address.city} {user.address.zip}"

if __name__ == "__main__":
    Argparser(print_result=True).run(greet)

Help output:

usage: app.py greet [--help] --user.name USER.NAME --user.age USER.AGE
                    [--user.address.city] [--user.address.zip]

options:
  --help                      show this help message and exit
  --user.name                 Display name. [type: str] (*)
  --user.age                  Age in years. [type: int] (*)
  --user.address.city         City name. [type: str]
  --user.address.zip          Postal or ZIP code. [type: int]

Class-based commands

from interfacy import Argparser

class Calculator:
    def add(self, a: int, b: int) -> int:
        return a + b

    def mul(self, a: int, b: int) -> int:
        return a * b

if __name__ == "__main__":
    Argparser(print_result=True).run(Calculator)

Decorator-based commands

from interfacy import Argparser

parser = Argparser()

@parser.command()
def greet(name: str) -> str:
    return f"Hello, {name}!"

@parser.command(name="calc", aliases=["c"])
class Calculator:
    def add(self, a: int, b: int) -> int:
        return a + b

    def mul(self, a: int, b: int) -> int:
        return a * b

if __name__ == "__main__":
    parser.run()

CLI entrypoint

Use the CLI entrypoint to run a target callable from a module or file, or to inspect its help:

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 symbol (e.g. main.py:main or pkg.cli:app).
  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

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

interfacy-0.4.0.tar.gz (147.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

interfacy-0.4.0-py3-none-any.whl (94.6 kB view details)

Uploaded Python 3

File details

Details for the file interfacy-0.4.0.tar.gz.

File metadata

  • Download URL: interfacy-0.4.0.tar.gz
  • Upload date:
  • Size: 147.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for interfacy-0.4.0.tar.gz
Algorithm Hash digest
SHA256 5bed7ae3d01be002adf5ad60e5c90bad37acbb50690bf188abe096a10a6c5f05
MD5 09d9bc14d29a996157175cfd0457556c
BLAKE2b-256 907d88dd462a1b46686c6b984d3aa0ad678d7e49e5c456fbd69fac51dfd0f02e

See more details on using hashes here.

File details

Details for the file interfacy-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: interfacy-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 94.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for interfacy-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fffda8f74cb6aa5d3de3691a82e1bb70c778330d6d93f73b811a4982f214e504
MD5 6fb3b38ce86b9a2e02c762b360b80ba9
BLAKE2b-256 b7c26ae24373b79e35fcde2a5c3301b8b016739942ebd0dadcd974284dcd94ea

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page