A tool for building interactive command line applications in Python
npx @tessl/cli install tessl/pypi-cmd2@2.0.0A powerful tool for building interactive command line applications in Python. cmd2 extends Python's built-in cmd module with a wealth of features to make it quick and easy for developers to build feature-rich and user-friendly interactive command line applications.
pip install cmd2import cmd2For accessing the main Cmd class:
from cmd2 import CmdCommon decorators and utilities:
from cmd2 import with_argparser, with_category, Settable
from cmd2 import style, fg, bg # ANSI stylingimport cmd2
import argparse
class MyApp(cmd2.Cmd):
"""Example cmd2 application"""
def __init__(self):
super().__init__()
def do_greet(self, args):
"""Say hello to someone"""
if args:
self.poutput(f"Hello, {args}!")
else:
self.poutput("Hello!")
# Using argparse for command parsing
parser = argparse.ArgumentParser()
parser.add_argument('name', help='Name to greet')
parser.add_argument('-s', '--shout', action='store_true', help='Shout the greeting')
@cmd2.with_argparser(parser)
def do_hello(self, args):
"""Advanced greeting with argparse"""
greeting = f"Hello, {args.name}!"
if args.shout:
greeting = greeting.upper()
self.poutput(greeting)
if __name__ == '__main__':
app = MyApp()
app.cmdloop()cmd2 is built around a main Cmd class that extends Python's standard cmd.Cmd with powerful additional features:
>, >>, and |The main Cmd class that applications inherit from to create command-line interfaces.
class Cmd(cmd.Cmd):
"""An easy but powerful framework for writing line-oriented command interpreters."""
def __init__(
self,
completekey: str = 'tab',
stdin: Optional[TextIO] = None,
stdout: Optional[TextIO] = None,
*,
persistent_history_file: str = '',
persistent_history_length: int = 1000,
startup_script: str = '',
silence_startup_script: bool = False,
include_py: bool = False,
include_ipy: bool = False,
allow_cli_args: bool = True,
transcript_files: Optional[List[str]] = None,
allow_redirection: bool = True,
multiline_commands: Optional[List[str]] = None,
terminators: Optional[List[str]] = None,
shortcuts: Optional[Dict[str, str]] = None,
command_sets: Optional[Iterable[CommandSet]] = None,
auto_load_commands: bool = True,
) -> None: ...
def cmdloop(self, intro: Optional[str] = None) -> None:
"""Repeatedly issue a prompt, accept input, parse and dispatch the command."""
def onecmd_plus_hooks(self, line: str) -> bool:
"""Execute command and run all hooks."""
def poutput(self, msg: Any = '', *, end: str = '\n') -> None:
"""Print message respecting output redirection."""
def perror(self, msg: Any = '', *, end: str = '\n', apply_style: bool = True) -> None:
"""Print error message to stderr with optional styling."""
def ppaged(self, msg: Any = '', *, end: str = '\n', chop: bool = False) -> None:
"""Print message using pager for long output."""Decorators for enhancing command methods with argument parsing and categorization.
def with_argparser(
parser: argparse.ArgumentParser,
*,
ns_provider: Optional[Callable[..., argparse.Namespace]] = None,
preserve_quotes: bool = False,
with_unknown_args: bool = False,
) -> Callable[[CommandFunc], CommandFunc]:
"""Decorator to parse command arguments using argparse.ArgumentParser."""
def with_argument_list() -> Callable[[CommandFunc], CommandFunc]:
"""Decorator to pass arguments as a list rather than a string."""
def with_category(category: str) -> Callable[[CommandFunc], CommandFunc]:
"""Decorator to categorize commands for help display."""
def as_subcommand_to(
command: str,
subcommand: str,
*,
help: Optional[str] = None
) -> Callable[[CommandFunc], CommandFunc]:
"""Decorator to register a function as a subcommand."""Functions for adding colors and styles to terminal output.
def style(
text: Any,
*,
fg: Optional[Union[FgColor, int, str]] = None,
bg: Optional[Union[BgColor, int, str]] = None,
bold: Optional[bool] = None,
dim: Optional[bool] = None,
italic: Optional[bool] = None,
underline: Optional[bool] = None,
strikethrough: Optional[bool] = None,
overline: Optional[bool] = None,
reverse: Optional[bool] = None,
hidden: Optional[bool] = None
) -> str:
"""Apply ANSI color and style to text."""
# Color constants
class fg:
"""Foreground color constants"""
BLACK: FgColor
RED: FgColor
GREEN: FgColor
YELLOW: FgColor
BLUE: FgColor
MAGENTA: FgColor
CYAN: FgColor
WHITE: FgColor
class bg:
"""Background color constants"""
BLACK: BgColor
RED: BgColor
GREEN: BgColor
YELLOW: BgColor
BLUE: BgColor
MAGENTA: BgColor
CYAN: BgColor
WHITE: BgColorCustom argument parser and completion classes extending argparse functionality.
class Cmd2ArgumentParser(argparse.ArgumentParser):
"""Custom ArgumentParser with better error formatting for cmd2."""
def __init__(
self,
prog: Optional[str] = None,
usage: Optional[str] = None,
description: Optional[str] = None,
epilog: Optional[str] = None,
parents: Sequence[argparse.ArgumentParser] = [],
formatter_class: argparse.HelpFormatter = argparse.RawDescriptionHelpFormatter,
prefix_chars: str = '-',
fromfile_prefix_chars: Optional[str] = None,
argument_default: Any = None,
conflict_handler: str = 'error',
add_help: bool = True,
allow_abbrev: bool = True,
) -> None: ...
class CompletionItem:
"""Represents a completion item with description."""
def __init__(self, text: str, description: str = '') -> None: ...
def set_default_argument_parser(
argument_parser_class: Type[argparse.ArgumentParser]
) -> None:
"""Set the default ArgumentParser class used by cmd2."""Classes for handling command execution results and statements.
class CommandResult:
"""Contains the result of running a command via app() function."""
def __init__(
self,
stdout: str,
stderr: str,
data: Optional[Any] = None
) -> None:
self.stdout = stdout
self.stderr = stderr
self.data = data
class Statement:
"""Represents a parsed command statement."""
command: str
args: str
arg_list: List[str]
raw: str
command_line: str
multiline_command: str
terminator: str = '\n'
suffix: str = ''
pipe_out: bool = False
output_to: str = ''Utility functions and classes for application configuration.
class Settable:
"""A setting which can be changed via the 'set' command."""
def __init__(
self,
name: str,
val_type: Type,
description: str,
choices: Optional[Iterable[str]] = None,
*,
settable_object: Optional[Any] = None,
onchange_cb: Optional[Callable[[str, str, str], None]] = None,
) -> None: ...
def categorize(
func: Callable,
category: str
) -> Callable:
"""Categorize a command function."""
class CompletionMode(Enum):
"""Enum for tab completion modes."""
SINGLE_TAB = "single"
DOUBLE_TAB = "double"
class CommandSet:
"""Set of commands that can be installed into a cmd2 application."""
def __init__(self) -> None: ...Exception types used throughout cmd2.
class Cmd2ArgparseError(Exception):
"""Raised when argparse has an error parsing arguments."""
class CommandSetRegistrationError(Exception):
"""Raised when a CommandSet fails to register."""
class CompletionError(Exception):
"""Raised when tab completion encounters an error."""
class SkipPostcommandHooks(Exception):
"""Raised to skip postcommand hooks."""COMMAND_NAME: str # Current command name attribute
DEFAULT_SHORTCUTS: Dict[str, str] # Default single-character shortcuts
DEFAULT_ARGUMENT_PARSER: Type[argparse.ArgumentParser] # Default parser classfrom typing import Any, Callable, Dict, Iterable, List, Optional, Sequence, TextIO, Type, Union
from enum import Enum
import argparse
# Type aliases
CommandFunc = Callable[..., Optional[bool]]
FgColor = Union[int, str]
BgColor = Union[int, str]