2019-12-24 13:34:34 +01:00
< p align = "center" >
2019-12-24 17:35:38 +01:00
< a href = "https://typer.tiangolo.com" > < img src = "https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" alt = "Typer" > < / a >
2019-12-24 13:34:34 +01:00
< / p >
< p align = "center" >
2019-12-24 21:14:42 +01:00
< em > Typer, build great CLIs. Easy to code. Based on Python type hints.< / em >
2019-12-24 13:34:34 +01:00
< / p >
< p align = "center" >
2020-07-19 13:27:40 +02:00
< a href = "https://github.com/tiangolo/typer/actions?query=workflow%3ATest" target = "_blank" >
< img src = "https://github.com/tiangolo/typer/workflows/Test/badge.svg" alt = "Test" >
< / a >
< a href = "https://github.com/tiangolo/typer/actions?query=workflow%3APublish" target = "_blank" >
< img src = "https://github.com/tiangolo/typer/workflows/Publish/badge.svg" alt = "Publish" >
2019-12-24 13:34:34 +01:00
< / a >
< a href = "https://codecov.io/gh/tiangolo/typer" target = "_blank" >
2020-07-19 13:27:40 +02:00
< img src = "https://img.shields.io/codecov/c/github/tiangolo/typer?color=%2334D058" alt = "Coverage" >
2019-12-24 13:34:34 +01:00
< / a >
< a href = "https://pypi.org/project/typer" target = "_blank" >
2020-07-19 13:27:40 +02:00
< img src = "https://img.shields.io/pypi/v/typer?color=%2334D058&label=pypi%20package" alt = "Package version" >
2019-12-24 13:34:34 +01:00
< / a >
< / p >
2019-12-20 16:36:04 +01:00
2019-12-24 13:34:34 +01:00
---
2019-12-20 16:36:04 +01:00
2019-12-24 13:34:34 +01:00
**Documentation**: < a href = "https://typer.tiangolo.com" target = "_blank" > https://typer.tiangolo.com< / a >
2019-12-20 16:36:04 +01:00
2019-12-24 13:34:34 +01:00
**Source Code**: < a href = "https://github.com/tiangolo/typer" target = "_blank" > https://github.com/tiangolo/typer< / a >
---
2020-06-22 19:53:17 +02:00
Typer is a library for building < abbr title = "command line interface, programs executed from a terminal" > CLI</ abbr > applications that users will **love using** and developers will **love creating** . Based on Python 3.6+ type hints.
2019-12-24 13:34:34 +01:00
The key features are:
* **Intuitive to write**: Great editor support. < abbr title = "also known as auto-complete, autocompletion, IntelliSense" > Completion</ abbr > everywhere. Less time debugging. Designed to be easy to use and learn. Less time reading docs.
2020-03-16 13:21:58 +01:00
* **Easy to use**: It's easy to use for the final users. Automatic help, and automatic completion for all shells.
2019-12-24 13:34:34 +01:00
* **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** .
2020-03-11 17:16:49 +01:00
* **Grow large**: Grow in complexity as much as you want, create arbitrarily complex trees of commands and groups of subcommands, with options and arguments.
2019-12-24 13:34:34 +01:00
:sparkles: Add docs for testing, password, version, context. Extra tests, include callback and autocompletion PR (#68)
* :sparkles: Implement custom handling for callbacks with types
* :sparkles: Implement type-based handling for completion functions
* :sparkles: Add examples for custom completion
* :memo: Add docs for custom autocompletion
* :white_check_mark: Add tests for autocompletion
* :sparkles: Document using the context
* :white_check_mark: Add tests for using the context
* :white_check_mark: Add tests init for context
* :wrench: Update Mypy config
* :white_check_mark: Add extra tests for completion
* :pencil2: Fix format, typos, and minor texts
* :sparkles: Update docs for printing, include stdout, stderr, and stdin
* :pencil2: Add references to FastAPI, fix typos
* :pencil2: Fix typo in Typer CLI
* :memo: Update docs for version
* :memo: Update docs for callbacks
* :memo: Update references to stdout/stderr in autocompletion
* :memo: Add docs for password in CLI option
* :memo: Add docs and tests for Testing
* :memo: Add new sections to docs
* :art: Fix formatting
2020-03-18 21:17:47 +01:00
## FastAPI of CLIs
< a href = "https://fastapi.tiangolo.com" target = "_blank" > < img src = "https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png" style = "width: 20%;" > < / a >
**Typer** is < a href = "https://fastapi.tiangolo.com" class = "external-link" target = "_blank" > FastAPI< / a > 's little sibling.
And it's intended to be the FastAPI of CLIs.
2019-12-24 13:34:34 +01:00
## Requirements
Python 3.6+
:sparkles: Add docs for testing, password, version, context. Extra tests, include callback and autocompletion PR (#68)
* :sparkles: Implement custom handling for callbacks with types
* :sparkles: Implement type-based handling for completion functions
* :sparkles: Add examples for custom completion
* :memo: Add docs for custom autocompletion
* :white_check_mark: Add tests for autocompletion
* :sparkles: Document using the context
* :white_check_mark: Add tests for using the context
* :white_check_mark: Add tests init for context
* :wrench: Update Mypy config
* :white_check_mark: Add extra tests for completion
* :pencil2: Fix format, typos, and minor texts
* :sparkles: Update docs for printing, include stdout, stderr, and stdin
* :pencil2: Add references to FastAPI, fix typos
* :pencil2: Fix typo in Typer CLI
* :memo: Update docs for version
* :memo: Update docs for callbacks
* :memo: Update references to stdout/stderr in autocompletion
* :memo: Add docs for password in CLI option
* :memo: Add docs and tests for Testing
* :memo: Add new sections to docs
* :art: Fix formatting
2020-03-18 21:17:47 +01:00
**Typer** stands on the shoulders of a giant. Its only internal dependency is < a href = "https://click.palletsprojects.com/" class = "external-link" target = "_blank" > Click< / a > .
2019-12-24 13:34:34 +01:00
## Installation
2019-12-26 21:20:51 +01:00
< div class = "termy" >
2019-12-26 21:22:43 +01:00
2019-12-26 21:20:51 +01:00
```console
2022-07-12 18:45:43 +02:00
$ pip install "typer[all]"
2019-12-26 21:20:51 +01:00
---> 100%
Successfully installed typer
2019-12-24 13:34:34 +01:00
```
2019-12-26 21:22:43 +01:00
2019-12-26 21:20:51 +01:00
< / div >
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
**Note**: that will include < a href = "https://rich.readthedocs.io/" class = "external-link" target = "_blank" > Rich</ a > . 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.
2019-12-24 13:34:34 +01:00
## Example
### The absolute minimum
* Create a file `main.py` with:
```Python
import typer
def main(name: str):
2022-07-12 18:45:43 +02:00
print(f"Hello {name}")
2019-12-24 13:34:34 +01:00
if __name__ == "__main__":
typer.run(main)
```
### Run it
Run your application:
2019-12-26 21:20:51 +01:00
< div class = "termy" >
2019-12-26 21:22:43 +01:00
2019-12-26 21:20:51 +01:00
```console
// Run your application
$ python main.py
2019-12-24 13:34:34 +01:00
2019-12-26 21:20:51 +01:00
// You get a nice error, you are missing NAME
2022-07-12 18:45:43 +02:00
< font color = "#F4BF75" > Usage: < / font > main.py [OPTIONS] NAME
< font color = "#A5A5A1" > Try < /font>< font color = "#44919F" > ' main.py < / font > < font color = "#44919F" > < b > --help< / b > < / font > < font color = "#44919F" > ' < / font > < font color = "#A5A5A1" > for help.< / font >
< font color = "#F92672" > ╭─ Error ───────────────────────────────────────────╮< / font >
< font color = "#F92672" > │< / font > Missing argument ' NAME' . < font color = "#F92672" > │< / font >
< font color = "#F92672" > ╰───────────────────────────────────────────────────╯< / font >
2019-12-24 13:34:34 +01:00
2019-12-26 21:20:51 +01:00
// You get a --help for free
$ python main.py --help
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
< b > < / b > < font color = "#F4BF75" > < b > Usage: < / b > < / font > < b > main.py [OPTIONS] NAME < / b >
< b > < / b >
< font color = "#A5A5A1" > ╭─ Arguments ───────────────────────────────────────╮< / font >
< font color = "#A5A5A1" > │ < / font > < font color = "#F92672" > *< / font > name < font color = "#F4BF75" > < b > TEXT< / b > < / font > [default: None] < font color = "#A6194C" > [required]< / font > │
< font color = "#A5A5A1" > ╰───────────────────────────────────────────────────╯< / font >
< font color = "#A5A5A1" > ╭─ Options ─────────────────────────────────────────╮< / font >
< font color = "#A5A5A1" > │ < / font > < font color = "#A1EFE4" > < b > --install-completion< / b > < / font > Install completion │
< font color = "#A5A5A1" > │ for the current │< / font >
< font color = "#A5A5A1" > │ shell. │< / font >
< font color = "#A5A5A1" > │ < / font > < font color = "#A1EFE4" > < b > --show-completion< / b > < / font > Show completion for │
< font color = "#A5A5A1" > │ the current shell, │< / font >
< font color = "#A5A5A1" > │ to copy it or │< / font >
< font color = "#A5A5A1" > │ customize the │< / font >
< font color = "#A5A5A1" > │ installation. │< / font >
< font color = "#A5A5A1" > │ < / font > < font color = "#A1EFE4" > < b > --help< / b > < / font > Show this message │
< font color = "#A5A5A1" > │ and exit. │< / font >
< font color = "#A5A5A1" > ╰───────────────────────────────────────────────────╯< / font >
2019-12-28 14:12:47 +01:00
2020-06-22 19:53:17 +02:00
// When you create a package you get ✨ auto-completion ✨ for free, installed with --install-completion
2019-12-26 21:20:51 +01:00
// Now pass the NAME argument
$ python main.py Camila
Hello Camila
// It works! 🎉
2019-12-24 13:34:34 +01:00
```
2019-12-26 21:22:43 +01:00
2019-12-26 21:20:51 +01:00
< / div >
2019-12-24 13:34:34 +01:00
2020-06-22 19:53:17 +02:00
**Note**: auto-completion works when you create a Python package and run it with `--install-completion` or when you use < a href = "https://typer.tiangolo.com/typer-cli/" class = "internal-link" target = "_blank" > Typer CLI</ a > .
2020-03-11 17:16:49 +01:00
2019-12-24 13:34:34 +01:00
## Example upgrade
2019-12-24 20:43:48 +01:00
This was the simplest example possible.
2019-12-24 13:34:34 +01:00
Now let's see one a bit more complex.
2019-12-28 14:12:47 +01:00
### An example with two subcommands
2019-12-24 13:34:34 +01:00
Modify the file `main.py` .
2019-12-28 14:12:47 +01:00
Create a `typer.Typer()` app, and create two subcommands with their parameters.
2019-12-24 13:34:34 +01:00
```Python hl_lines="3 6 11 20"
import typer
app = typer.Typer()
@app .command()
def hello(name: str):
2022-07-12 18:45:43 +02:00
print(f"Hello {name}")
2019-12-24 13:34:34 +01:00
@app .command()
def goodbye(name: str, formal: bool = False):
if formal:
2022-07-12 18:45:43 +02:00
print(f"Goodbye Ms. {name}. Have a good day.")
2019-12-24 13:34:34 +01:00
else:
2022-07-12 18:45:43 +02:00
print(f"Bye {name}!")
2019-12-24 13:34:34 +01:00
if __name__ == "__main__":
app()
```
And that will:
* Explicitly create a `typer.Typer` app.
* The previous `typer.run` actually creates one implicitly for you.
2019-12-28 14:12:47 +01:00
* Add two subcommands with `@app.command()` .
2019-12-24 13:34:34 +01:00
* Execute the `app()` itself, as if it was a function (instead of `typer.run` ).
### Run the upgraded example
2022-07-12 18:45:43 +02:00
Check the new help:
2019-12-26 21:20:51 +01:00
< div class = "termy" >
2019-12-26 21:22:43 +01:00
2019-12-26 21:20:51 +01:00
```console
$ python main.py --help
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
< b > < / b > < font color = "#F4BF75" > < b > Usage: < / b > < / font > < b > main.py [OPTIONS] COMMAND [ARGS]... < / b >
< b > < / b >
< font color = "#A5A5A1" > ╭─ Options ─────────────────────────────────────────╮< / font >
< font color = "#A5A5A1" > │ < / font > < font color = "#A1EFE4" > < b > --install-completion< / b > < / font > Install completion │
< font color = "#A5A5A1" > │ for the current │< / font >
< font color = "#A5A5A1" > │ shell. │< / font >
< font color = "#A5A5A1" > │ < / font > < font color = "#A1EFE4" > < b > --show-completion< / b > < / font > Show completion for │
< font color = "#A5A5A1" > │ the current shell, │< / font >
< font color = "#A5A5A1" > │ to copy it or │< / font >
< font color = "#A5A5A1" > │ customize the │< / font >
< font color = "#A5A5A1" > │ installation. │< / font >
< font color = "#A5A5A1" > │ < / font > < font color = "#A1EFE4" > < b > --help< / b > < / font > Show this message │
< font color = "#A5A5A1" > │ and exit. │< / font >
< font color = "#A5A5A1" > ╰───────────────────────────────────────────────────╯< / font >
< font color = "#A5A5A1" > ╭─ Commands ────────────────────────────────────────╮< / font >
< font color = "#A5A5A1" > │ < / font > < font color = "#A1EFE4" > < b > goodbye < / b > < / font > │
< font color = "#A5A5A1" > │ < / font > < font color = "#A1EFE4" > < b > hello < / b > < / font > │
< font color = "#A5A5A1" > ╰───────────────────────────────────────────────────╯< / font >
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
// You have 2 subcommands (the 2 functions): goodbye and hello
```
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
< / div >
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
Now check the help for the `hello` command:
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
< div class = "termy" >
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
```console
2019-12-26 21:20:51 +01:00
$ python main.py hello --help
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
< b > < / b > < font color = "#F4BF75" > < b > Usage: < / b > < / font > < b > main.py hello [OPTIONS] NAME < / b >
< b > < / b >
< font color = "#A5A5A1" > ╭─ Arguments ───────────────────────────────────────╮< / font >
< font color = "#A5A5A1" > │ < / font > < font color = "#F92672" > *< / font > name < font color = "#F4BF75" > < b > TEXT< / b > < / font > [default: None] < font color = "#A6194C" > [required]< / font > │
< font color = "#A5A5A1" > ╰───────────────────────────────────────────────────╯< / font >
< font color = "#A5A5A1" > ╭─ Options ─────────────────────────────────────────╮< / font >
< font color = "#A5A5A1" > │ < / font > < font color = "#A1EFE4" > < b > --help< / b > < / font > Show this message and exit. │
< font color = "#A5A5A1" > ╰───────────────────────────────────────────────────╯< / font >
```
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
< / div >
2020-06-24 21:05:21 +02:00
2022-07-12 18:45:43 +02:00
And now check the help for the `goodbye` command:
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
< div class = "termy" >
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
```console
2019-12-26 21:20:51 +01:00
$ python main.py goodbye --help
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
< b > < / b > < font color = "#F4BF75" > < b > Usage: < / b > < / font > < b > main.py goodbye [OPTIONS] NAME < / b >
< b > < / b >
< font color = "#A5A5A1" > ╭─ Arguments ───────────────────────────────────────╮< / font >
< font color = "#A5A5A1" > │ < / font > < font color = "#F92672" > *< / font > name < font color = "#F4BF75" > < b > TEXT< / b > < / font > [default: None] < font color = "#A6194C" > [required]< / font > │
< font color = "#A5A5A1" > ╰───────────────────────────────────────────────────╯< / font >
< font color = "#A5A5A1" > ╭─ Options ─────────────────────────────────────────╮< / font >
< font color = "#A5A5A1" > │ < / font > < font color = "#A1EFE4" > < b > --formal< / b > < / font > < font color = "#AE81FF" > < b > --no-formal< / b > < / font > [default: no-formal] │
< font color = "#A5A5A1" > │ < / font > < font color = "#A1EFE4" > < b > --help< / b > < / font > Show this message │
< font color = "#A5A5A1" > │ and exit. │< / font >
< font color = "#A5A5A1" > ╰───────────────────────────────────────────────────╯< / font >
// Automatic --formal and --no-formal for the bool option 🎉
```
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
< / div >
2020-06-24 21:05:21 +02:00
2022-07-12 18:45:43 +02:00
Now you can try out the new command line application:
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
< div class = "termy" >
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
```console
// Use it with the hello command
2019-12-24 13:34:34 +01:00
2019-12-26 21:20:51 +01:00
$ python main.py hello Camila
2019-12-24 13:34:34 +01:00
Hello Camila
2019-12-26 21:20:51 +01:00
// And with the goodbye command
2019-12-24 13:34:34 +01:00
2019-12-26 21:20:51 +01:00
$ python main.py goodbye Camila
2019-12-24 13:34:34 +01:00
Bye Camila!
2019-12-26 21:20:51 +01:00
// And with --formal
2019-12-24 13:34:34 +01:00
2019-12-26 21:20:51 +01:00
$ python main.py goodbye --formal Camila
2019-12-24 13:34:34 +01:00
Goodbye Ms. Camila. Have a good day.
```
2019-12-26 21:22:43 +01:00
2019-12-26 21:20:51 +01:00
< / div >
2019-12-24 13:34:34 +01:00
### Recap
:sparkles: Add docs for testing, password, version, context. Extra tests, include callback and autocompletion PR (#68)
* :sparkles: Implement custom handling for callbacks with types
* :sparkles: Implement type-based handling for completion functions
* :sparkles: Add examples for custom completion
* :memo: Add docs for custom autocompletion
* :white_check_mark: Add tests for autocompletion
* :sparkles: Document using the context
* :white_check_mark: Add tests for using the context
* :white_check_mark: Add tests init for context
* :wrench: Update Mypy config
* :white_check_mark: Add extra tests for completion
* :pencil2: Fix format, typos, and minor texts
* :sparkles: Update docs for printing, include stdout, stderr, and stdin
* :pencil2: Add references to FastAPI, fix typos
* :pencil2: Fix typo in Typer CLI
* :memo: Update docs for version
* :memo: Update docs for callbacks
* :memo: Update references to stdout/stderr in autocompletion
* :memo: Add docs for password in CLI option
* :memo: Add docs and tests for Testing
* :memo: Add new sections to docs
* :art: Fix formatting
2020-03-18 21:17:47 +01:00
In summary, you declare **once** the types of parameters (*CLI arguments* and *CLI options* ) as function parameters.
2019-12-24 13:34:34 +01:00
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
```
2019-12-28 14:12:47 +01:00
And similarly for **files** , **paths** , **enums** (choices), etc. And there are tools to create **groups of subcommands** , add metadata, extra **validation** , etc.
2019-12-24 13:34:34 +01:00
**You get**: great editor support, including **completion** and **type checks** everywhere.
2020-06-22 19:53:17 +02:00
**Your users get**: automatic ** `--help` **, **auto-completion** in their terminal (Bash, Zsh, Fish, PowerShell) when they install your package or when using < a href = "https://typer.tiangolo.com/typer-cli/" class = "internal-link" target = "_blank" > Typer CLI</ a > .
2019-12-24 13:34:34 +01:00
2020-01-18 19:35:49 +01:00
For a more complete example including more features, see the < a href = "https://typer.tiangolo.com/tutorial/" > Tutorial - User Guide< / a > .
2019-12-24 13:34:34 +01:00
## Optional Dependencies
2020-01-17 16:27:17 +01:00
Typer uses < a href = "https://click.palletsprojects.com/" class = "external-link" target = "_blank" > Click< / a > internally. That's the only dependency.
2019-12-24 13:34:34 +01:00
2019-12-24 20:43:48 +01:00
But you can also install extras:
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
* < a href = "https://rich.readthedocs.io/en/stable/index.html" class = "external-link" target = "_blank" >< code > rich</ code ></ a > : and Typer will show nicely formatted errors automatically.
2020-03-16 13:21:58 +01:00
* < a href = "https://github.com/sarugaku/shellingham" class = "external-link" target = "_blank" >< code > shellingham</ code ></ a > : and Typer will automatically detect the current shell when installing completion.
* With `shellingham` you can just use `--install-completion` .
:sparkles: Add docs for testing, password, version, context. Extra tests, include callback and autocompletion PR (#68)
* :sparkles: Implement custom handling for callbacks with types
* :sparkles: Implement type-based handling for completion functions
* :sparkles: Add examples for custom completion
* :memo: Add docs for custom autocompletion
* :white_check_mark: Add tests for autocompletion
* :sparkles: Document using the context
* :white_check_mark: Add tests for using the context
* :white_check_mark: Add tests init for context
* :wrench: Update Mypy config
* :white_check_mark: Add extra tests for completion
* :pencil2: Fix format, typos, and minor texts
* :sparkles: Update docs for printing, include stdout, stderr, and stdin
* :pencil2: Add references to FastAPI, fix typos
* :pencil2: Fix typo in Typer CLI
* :memo: Update docs for version
* :memo: Update docs for callbacks
* :memo: Update references to stdout/stderr in autocompletion
* :memo: Add docs for password in CLI option
* :memo: Add docs and tests for Testing
* :memo: Add new sections to docs
* :art: Fix formatting
2020-03-18 21:17:47 +01:00
* Without `shellingham` , you have to pass the name of the shell to install completion for, e.g. `--install-completion bash` .
2019-12-24 13:34:34 +01:00
2022-07-12 18:45:43 +02:00
You can install `typer` with `rich` and `shellingham` with `pip install typer[all]` .
2019-12-20 16:36:04 +01:00
## License
This project is licensed under the terms of the MIT license.