Typer

Typer, build great CLIs. Easy to code. Based on Python type hints.

Test Publish Coverage Package version

--- **Documentation**: https://typer.tiangolo.com **Source Code**: https://github.com/tiangolo/typer --- Typer is a library for building CLI applications that users will **love using** and developers will **love creating**. Based on Python 3.6+ type hints. The key features are: * **Intuitive to write**: Great editor support. Completion everywhere. Less time debugging. Designed to be easy to use and learn. Less time reading docs. * **Easy to use**: It's easy to use for the final users. Automatic help, and automatic completion for all shells. * **Short**: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs. * **Start simple**: The simplest example adds only 2 lines of code to your app: **1 import, 1 function call**. * **Grow large**: Grow in complexity as much as you want, create arbitrarily complex trees of commands and groups of subcommands, with options and arguments. ## FastAPI of CLIs **Typer** is FastAPI's little sibling. And it's intended to be the FastAPI of CLIs. ## Requirements Python 3.6+ **Typer** stands on the shoulders of a giant. Its only internal dependency is Click. ## Installation
```console $ pip install "typer[all]" ---> 100% Successfully installed typer ```
**Note**: that will include Rich. Rich is the recommended library to *display* information on the terminal, it is optional, but when installed, it's deeply integrated into **Typer** to display beautiful output. ## Example ### The absolute minimum * Create a file `main.py` with: ```Python import typer def main(name: str): print(f"Hello {name}") if __name__ == "__main__": typer.run(main) ``` ### Run it Run your application:
```console // Run your application $ python main.py // You get a nice error, you are missing NAME Usage: main.py [OPTIONS] NAME Try 'main.py --help' for help. ╭─ Error ───────────────────────────────────────────╮ Missing argument 'NAME'. ╰───────────────────────────────────────────────────╯ // You get a --help for free $ python main.py --help Usage: main.py [OPTIONS] NAME ╭─ Arguments ───────────────────────────────────────╮ * name TEXT [default: None] [required]╰───────────────────────────────────────────────────╯ ╭─ Options ─────────────────────────────────────────╮ --install-completion Install completion │ │ for the current │ │ shell. │ --show-completion Show completion for │ │ the current shell, │ │ to copy it or │ │ customize the │ │ installation. │ --help Show this message │ │ and exit. │ ╰───────────────────────────────────────────────────╯ // When you create a package you get ✨ auto-completion ✨ for free, installed with --install-completion // Now pass the NAME argument $ python main.py Camila Hello Camila // It works! 🎉 ```
**Note**: auto-completion works when you create a Python package and run it with `--install-completion` or when you use Typer CLI. ## Example upgrade This was the simplest example possible. Now let's see one a bit more complex. ### An example with two subcommands Modify the file `main.py`. Create a `typer.Typer()` app, and create two subcommands with their parameters. ```Python hl_lines="3 6 11 20" import typer app = typer.Typer() @app.command() def hello(name: str): print(f"Hello {name}") @app.command() def goodbye(name: str, formal: bool = False): if formal: print(f"Goodbye Ms. {name}. Have a good day.") else: print(f"Bye {name}!") if __name__ == "__main__": app() ``` And that will: * Explicitly create a `typer.Typer` app. * The previous `typer.run` actually creates one implicitly for you. * Add two subcommands with `@app.command()`. * Execute the `app()` itself, as if it was a function (instead of `typer.run`). ### Run the upgraded example Check the new help:
```console $ python main.py --help Usage: main.py [OPTIONS] COMMAND [ARGS]... ╭─ Options ─────────────────────────────────────────╮ --install-completion Install completion │ │ for the current │ │ shell. │ --show-completion Show completion for │ │ the current shell, │ │ to copy it or │ │ customize the │ │ installation. │ --help Show this message │ │ and exit. │ ╰───────────────────────────────────────────────────╯ ╭─ Commands ────────────────────────────────────────╮ goodbye hello ╰───────────────────────────────────────────────────╯ // You have 2 subcommands (the 2 functions): goodbye and hello ```
Now check the help for the `hello` command:
```console $ python main.py hello --help Usage: main.py hello [OPTIONS] NAME ╭─ Arguments ───────────────────────────────────────╮ * name TEXT [default: None] [required]╰───────────────────────────────────────────────────╯ ╭─ Options ─────────────────────────────────────────╮ --help Show this message and exit. │ ╰───────────────────────────────────────────────────╯ ```
And now check the help for the `goodbye` command:
```console $ python main.py goodbye --help Usage: main.py goodbye [OPTIONS] NAME ╭─ Arguments ───────────────────────────────────────╮ * name TEXT [default: None] [required]╰───────────────────────────────────────────────────╯ ╭─ Options ─────────────────────────────────────────╮ --formal --no-formal [default: no-formal] │ --help Show this message │ │ and exit. │ ╰───────────────────────────────────────────────────╯ // Automatic --formal and --no-formal for the bool option 🎉 ```
Now you can try out the new command line application:
```console // Use it with the hello command $ python main.py hello Camila Hello Camila // And with the goodbye command $ python main.py goodbye Camila Bye Camila! // And with --formal $ python main.py goodbye --formal Camila Goodbye Ms. Camila. Have a good day. ```
### Recap In summary, you declare **once** the types of parameters (*CLI arguments* and *CLI options*) as function parameters. You do that with standard modern Python types. You don't have to learn a new syntax, the methods or classes of a specific library, etc. Just standard **Python 3.6+**. For example, for an `int`: ```Python total: int ``` or for a `bool` flag: ```Python force: bool ``` And similarly for **files**, **paths**, **enums** (choices), etc. And there are tools to create **groups of subcommands**, add metadata, extra **validation**, etc. **You get**: great editor support, including **completion** and **type checks** everywhere. **Your users get**: automatic **`--help`**, **auto-completion** in their terminal (Bash, Zsh, Fish, PowerShell) when they install your package or when using Typer CLI. For a more complete example including more features, see the Tutorial - User Guide. ## Optional Dependencies Typer uses Click internally. That's the only dependency. But you can also install extras: * rich: and Typer will show nicely formatted errors automatically. * shellingham: and Typer will automatically detect the current shell when installing completion. * With `shellingham` you can just use `--install-completion`. * Without `shellingham`, you have to pass the name of the shell to install completion for, e.g. `--install-completion bash`. You can install `typer` with `rich` and `shellingham` with `pip install typer[all]`. ## License This project is licensed under the terms of the MIT license.