From: alex Date: Fri, 22 Apr 2022 18:39:00 +0000 (+0200) Subject: Initial add of /programming/python/creating_nice_python_cli_tools X-Git-Tag: 20240214-emacs~584 X-Git-Url: https://xn--ix-yja.es/gitweb/?a=commitdiff_plain;h=60c11b0da8f43eb7e090f298fc2d39faad7660c7;p=alex.git Initial add of /programming/python/creating_nice_python_cli_tools --- diff --git a/programming/python/creating_nice_python_cli_tools.md b/programming/python/creating_nice_python_cli_tools.md new file mode 100644 index 0000000..b1ec010 --- /dev/null +++ b/programming/python/creating_nice_python_cli_tools.md @@ -0,0 +1,22 @@ +* Use [my suggestions for setting up Python projects](project_setup), particularly: + * Provide instructions for installing your tool using [pipx](https://github.com/pypa/pipx). + Using pipx, people can install and upgrade your script using a simple command that requires no administrative privileges (but it requires having Python and pipx installed). + * As you are using [poetry](https://python-poetry.org/), following the indications above: + * Use [Poetry's support for specifying scripts](https://python-poetry.org/docs/pyproject/#scripts), so when installing your tool via pipx or other means, your scripts are added to the user's path. + * Dependencies you define will be installed automatically along with your application. + As you are using pipx, those dependencies will be installed to a isolated virtualenv, so they will not interfere with anything on your system. +* If your application requires secrets, such as credentials or others, consider using: + * The standard [getpass](https://docs.python.org/3/library/getpass.html) module. + This prompts for a string on the command line, hiding what the user types. + * The [keyring](https://pypi.org/project/keyring/) library. + This stores secrets using your operating system facilities. +* Use the [appdirs](https://pypi.org/project/appdirs/) library to obtain "user paths", such as the users directory for configuration, cache, or data. + appdirs knows the proper paths for Linux, macOS and Windows. + So for example, if your tool caches files and uses appdirs to find the cache directory, you might gain benefits such as cache files being excluded from backups. +* Use the [tqdm](https://tqdm.github.io/) library to add a progress bar if your tool requires significant time to complete a process. +* Although you can use other fancier tools for parsing command-line arguments, the standard [argparse](https://docs.python.org/3/library/argparse.html) module is good enough for most tools. + It has decent support for [sub-commands](https://docs.python.org/3/library/argparse.html#sub-commands), and the linked document describes a very nice pattern to define functions for sub-commands, under "One particularly effective way of handling sub-commands..." +* Remember that the standard [json](https://docs.python.org/3/library/json.html) module is built-in. + You can use it to add a mode to your tool that generates JSON output instead of human-readable output, for easy automation of your tool, maybe using [jq](https://stedolan.github.io/jq/) or [fx](https://github.com/antonmedv/fx). + +You can find examples for many of those techniques in my [repos](https://github.com/alexpdp7?tab=repositories&q=&type=&language=python&sort=).