|
| 1 | +# Quickstart |
| 2 | + |
| 3 | +```{currentmodule} click |
| 4 | +``` |
| 5 | + |
| 6 | +## Install |
| 7 | + |
| 8 | +Install from PyPI: |
| 9 | + |
| 10 | +```console |
| 11 | +pip install click |
| 12 | +``` |
| 13 | + |
| 14 | +Installing into a virtual environment is highly recommended. We suggest {ref}`virtualenv-heading`. |
| 15 | + |
| 16 | +## Examples |
| 17 | + |
| 18 | +Some standalone examples of Click applications are packaged with Click. They are available in the |
| 19 | +[examples folder](https://github.com/pallets/click/tree/main/examples) of the repo. |
| 20 | + |
| 21 | +- [inout](https://github.com/pallets/click/tree/main/examples/inout) : A very simple example of an application that can |
| 22 | + read from files and write to files and also accept input from stdin or write to stdout. |
| 23 | +- [validation](https://github.com/pallets/click/tree/main/examples/validation) : A simple example of an application that |
| 24 | + performs custom validation of parameters in different ways. |
| 25 | +- [naval](https://github.com/pallets/click/tree/main/examples/naval) : Port of the [docopt](http://docopt.org/) naval |
| 26 | + example. |
| 27 | +- [colors](https://github.com/pallets/click/tree/main/examples/colors) : A simple example that colorizes text. Uses |
| 28 | + colorama on Windows. |
| 29 | +- [aliases](https://github.com/pallets/click/tree/main/examples/aliases) : An advanced example that implements |
| 30 | + {ref}`aliases`. |
| 31 | +- [imagepipe](https://github.com/pallets/click/tree/main/examples/imagepipe) : A complex example that implements some |
| 32 | + {ref}`command-pipelines` . It chains together image processing instructions. Requires pillow. |
| 33 | +- [repo](https://github.com/pallets/click/tree/main/examples/repo) : An advanced example that implements a |
| 34 | + Git-/Mercurial-like command line interface. |
| 35 | +- [complex](https://github.com/pallets/click/tree/main/examples/complex) : A very advanced example that implements |
| 36 | + loading subcommands dynamically from a plugin folder. |
| 37 | +- [termui](https://github.com/pallets/click/tree/main/examples/termui) : A simple example that showcases terminal UI |
| 38 | + helpers provided by click. |
| 39 | + |
| 40 | +## Basic Concepts - Creating a Command |
| 41 | + |
| 42 | +Click is based on declaring commands through decorators. Internally, there is a non-decorator interface for advanced use |
| 43 | +cases, but it's discouraged for high-level usage. |
| 44 | + |
| 45 | +A function becomes a Click command line tool by decorating it through {func}`command`. At its simplest, just |
| 46 | +decorating a function with this decorator will make it into a callable script: |
| 47 | + |
| 48 | + |
| 49 | +```{eval-rst} |
| 50 | +.. click:example:: |
| 51 | + import click |
| 52 | +
|
| 53 | + @click.command() |
| 54 | + def hello(): |
| 55 | + click.echo('Hello World!') |
| 56 | +
|
| 57 | +What's happening is that the decorator converts the function into a :class:`Command` which then can be invoked: |
| 58 | +
|
| 59 | +.. click:example:: |
| 60 | + if __name__ == '__main__': |
| 61 | + hello() |
| 62 | +
|
| 63 | +And what it looks like: |
| 64 | +
|
| 65 | +.. click:run:: |
| 66 | + invoke(hello, args=[], prog_name='python hello.py') |
| 67 | +
|
| 68 | +And the corresponding help page: |
| 69 | +
|
| 70 | +.. click:run:: |
| 71 | + invoke(hello, args=['--help'], prog_name='python hello.py') |
| 72 | +``` |
| 73 | + |
| 74 | +## Echoing |
| 75 | + |
| 76 | +Why does this example use {func}`echo` instead of the regular {func}`print` function? The answer to this question is |
| 77 | +that Click attempts to support different environments consistently and to be very robust even when the environment is |
| 78 | +misconfigured. Click wants to be functional at least on a basic level even if everything is completely broken. |
| 79 | + |
| 80 | +What this means is that the {func}`echo` function applies some error correction in case the terminal is misconfigured |
| 81 | +instead of dying with a {exc}`UnicodeError`. |
| 82 | + |
| 83 | +The echo function also supports color and other styles in output. It will automatically remove styles if the output |
| 84 | +stream is a file. On Windows, colorama is automatically installed and used. See {ref}`ansi-colors`. |
| 85 | + |
| 86 | +If you don't need this, you can also use the `print()` construct / function. |
| 87 | + |
| 88 | +## Nesting Commands |
| 89 | + |
| 90 | +Commands can be attached to other commands of type {class}`Group`. This allows arbitrary nesting of scripts. As an |
| 91 | +example here is a script that implements two commands for managing databases: |
| 92 | + |
| 93 | +```{eval-rst} |
| 94 | +.. click:example:: |
| 95 | + @click.group() |
| 96 | + def cli(): |
| 97 | + pass |
| 98 | +
|
| 99 | + @click.command() |
| 100 | + def initdb(): |
| 101 | + click.echo('Initialized the database') |
| 102 | +
|
| 103 | + @click.command() |
| 104 | + def dropdb(): |
| 105 | + click.echo('Dropped the database') |
| 106 | +
|
| 107 | + cli.add_command(initdb) |
| 108 | + cli.add_command(dropdb) |
| 109 | +``` |
| 110 | + |
| 111 | +As you can see, the {func}`group` decorator works like the {func}`command` decorator, but creates a {class}`Group` |
| 112 | +object instead which can be given multiple subcommands that can be attached with {meth}`Group.add_command`. |
| 113 | + |
| 114 | +For simple scripts, it's also possible to automatically attach and create a command by using the {meth}`Group.command` |
| 115 | +decorator instead. The above script can instead be written like this: |
| 116 | + |
| 117 | +```{eval-rst} |
| 118 | +.. click:example:: |
| 119 | + @click.group() |
| 120 | + def cli(): |
| 121 | + pass |
| 122 | +
|
| 123 | + @cli.command() |
| 124 | + def initdb(): |
| 125 | + click.echo('Initialized the database') |
| 126 | +
|
| 127 | + @cli.command() |
| 128 | + def dropdb(): |
| 129 | + click.echo('Dropped the database') |
| 130 | +
|
| 131 | +You would then invoke the :class:`Group` in your entry points or other invocations: |
| 132 | +
|
| 133 | +.. click:example:: |
| 134 | + if __name__ == '__main__': |
| 135 | + cli() |
| 136 | +``` |
| 137 | + |
| 138 | +## Registering Commands Later |
| 139 | + |
| 140 | +Instead of using the `@group.command()` decorator, commands can be decorated with the plain `@command()` decorator |
| 141 | +and registered with a group later with `group.add_command()`. This could be used to split commands into multiple Python |
| 142 | +modules. |
| 143 | + |
| 144 | +```{code-block} python |
| 145 | + @click.command() |
| 146 | + def greet(): |
| 147 | + click.echo("Hello, World!") |
| 148 | +``` |
| 149 | + |
| 150 | +```{code-block} python |
| 151 | + @click.group() |
| 152 | + def group(): |
| 153 | + pass |
| 154 | +
|
| 155 | + group.add_command(greet) |
| 156 | +``` |
| 157 | + |
| 158 | +## Adding Parameters |
| 159 | + |
| 160 | +To add parameters, use the {func}`option` and {func}`argument` decorators: |
| 161 | + |
| 162 | +```{eval-rst} |
| 163 | +.. click:example:: |
| 164 | + @click.command() |
| 165 | + @click.option('--count', default=1, help='number of greetings') |
| 166 | + @click.argument('name') |
| 167 | + def hello(count, name): |
| 168 | + for x in range(count): |
| 169 | + click.echo(f"Hello {name}!") |
| 170 | +
|
| 171 | +What it looks like: |
| 172 | +
|
| 173 | +.. click:run:: |
| 174 | + invoke(hello, args=['--help'], prog_name='python hello.py') |
| 175 | +``` |
| 176 | + |
| 177 | +## Switching to Entry Points |
| 178 | + |
| 179 | +In the code you wrote so far there is a block at the end of the file which looks like this: |
| 180 | +`if __name__ == '__main__':`. This is traditionally how a standalone Python file looks like. With Click you can continue |
| 181 | +doing that, but a better way is to package your app with an entry point. |
| 182 | + |
| 183 | +There are two main (and many more) reasons for this: |
| 184 | + |
| 185 | +The first one is that installers automatically generate executable wrappers for Windows so your command line utilities |
| 186 | +work on Windows too. |
| 187 | + |
| 188 | +The second reason is that entry point scripts work with virtualenv on Unix without the virtualenv having to be |
| 189 | +activated. This is a very useful concept which allows you to bundle your scripts with all requirements into a |
| 190 | +virtualenv. |
| 191 | + |
| 192 | +Click is perfectly equipped to work with that and in fact the rest of the documentation will assume that you are writing |
| 193 | +applications as distributed packages. |
| 194 | + |
| 195 | +Look at the {doc}`entry-points` chapter before reading the rest as the examples assume that you will be using entry |
| 196 | +points. |
0 commit comments