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.2.tar.gz (158.0 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.2-py3-none-any.whl (102.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: interfacy-0.4.2.tar.gz
  • Upload date:
  • Size: 158.0 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.2.tar.gz
Algorithm Hash digest
SHA256 7ffbe4c22bddab8b50475af1606e7dcb4832a6d4bb0a35b1be24bfa89859e3d0
MD5 cccca999ef784fbd600ecfbf92f13508
BLAKE2b-256 8a93daf15cd3d2360f681e314e02b67d7259132137db90b73aa035a18276554b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: interfacy-0.4.2-py3-none-any.whl
  • Upload date:
  • Size: 102.3 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 0bb1b4339d87a396e03b89f9518463817241d469443cbc3f03009bb735ba2b73
MD5 0eddd00c47d2320cc87956e17f380add
BLAKE2b-256 1c5cb60695cac1ee52186854121b821561cde187ef7d1e9f7e35d2e86ab88a6d

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