🌐
GitHub
github.com › shadawck › awesome-cli-frameworks
GitHub - shadawck/awesome-cli-frameworks: Collection of tools to build beautiful command line interface in different languages · GitHub
Click : Click is a Python package for creating beautiful command line interfaces in a composable way with as little code as necessary. It's the "Command Line Interface Creation Kit".
Discussions

The best Python CLI library, arguably.
🌐 r/madeinpython
6
14
June 16, 2023
clypi - Your all-in-one beautiful, lightweight, type-safe, (and now) prod-ready CLIs
Congrats on your project. I'm glad to see CLIs getting the love they deserve. I'm not affiliated with Cyclopts , but I really like it (and mention it frequently). It may be a good addition to your Comparison list. More on reddit.com
🌐 r/Python
42
130
March 29, 2025
The best Python CLI library, arguably.
No comparison to fire? More on reddit.com
🌐 r/Python
14
38
May 17, 2024
What is your go-to CLI library?
For anything bigger than what argparse feels comfortable for using, I use Click . It's pretty easy to build complex CLIs and the page I linked is about their bash autocomplete (unfortunately they only autocomplete in bash, last I recall). More on reddit.com
🌐 r/Python
25
23
June 27, 2017
🌐
Medium
medium.com › @wilson79 › 10-best-python-cli-libraries-for-developers-picking-the-right-one-for-your-project-cefb0bd41df1
10+ Best Python CLI Libraries for Developers: Picking the Right One for Your Project | by Wilson | Medium
February 3, 2026 - You point it at any Python function, class, or module, and it automatically generates a CLI. No decorators, no configuration. ... When NOT to use it: Production tools where you need precise control over arguments and help text. Best for: Large, complex CLI applications (think enterprise-level) Cement is a full application framework for CLIs.
🌐
The Hitchhiker's Guide to Python
docs.python-guide.org › scenarios › cli
Command-line Applications — The Hitchhiker's Guide to Python
The framework is meant to be used to create multi-level commands such as svn and git, where the main program handles some basic argument parsing and then invokes a sub-command to do the work. Cement is an advanced CLI Application Framework. Its goal is to introduce a standard and feature-full platform for both simple and complex command line applications as well as support rapid development needs without sacrificing quality.
🌐
ThemeSelection
themeselection.com › home › collections › 9 must have python cli library for developers in 2025
10+ Best Python CLI Library for Developers - ThemeSelection
August 11, 2026 - Furthermore, this library employs a controller-based architecture, allowing developers to structure their CLI applications in a modular and organized manner. Besides, Cement offers a range of features, including argument parsing, configuration handling, and plugin support, streamlining the development of complex and scalable command-line tools. Due to its flexibility and ease of use, Cement serves as a powerful choice for developers seeking a versatile framework to construct modular and feature-rich Python command-line applications.
🌐
Builtoncement
builtoncement.com
Cement - CLI Application Framework for Python
The most advanced, and feature-full CLI framework for Python development.
🌐
Plain English
python.plainenglish.io › 10-python-cli-tools-that-make-life-easier-eb11a3820c94
10 Python CLI Tools That Make Life Easier
December 3, 2025 - Sitemap · Open in app · Sign up · Sign in · Get app · Write · Search
🌐
Safjan
safjan.com › home › note › alternatives for building python cli apps
Alternatives for Building Python CLI Apps
July 17, 2023 - Use-case: Fire is best suited for quickly creating simple CLI tools based on existing Python code. It is ideal for situations where you want to expose the functionality of your Python objects through a command-line interface without the need for explicit command definitions. To learn more about Fire, refer to the official documentation or explore the GitHub repository. cement is a powerful and extensible CLI framework for Python.
Find elsewhere
🌐
pytz
pythonhosted.org › pyCLI
cli — command line tools — pyCLI devel documentation
The cli package is a framework for making simple, correct command line applications in Python. With cli, you can quickly add standard command line parsing; logging; unit and functional testing; and profiling to your CLI apps.
🌐
GitHub
github.com › treykeown › arguably
GitHub - treykeown/arguably: The best Python CLI library, arguably. · GitHub
The best Python CLI library, arguably. Contribute to treykeown/arguably development by creating an account on GitHub.
🌐
Reddit
reddit.com › r/madeinpython › the best python cli library, arguably.
r/madeinpython on Reddit: The best Python CLI library, arguably.
June 16, 2023 -

I tried to make the best CLI library out there - been working on it for a few weeks now. This is my first serious attempt at an open source project with proper testing and docs - wanted to make something people could actually use.

Would love any thoughts on arguably!

https://github.com/treykeown/arguably

A small example:

#!/usr/bin/env python3
import arguably

@arguably.command
def some_function(required, not_required=2, *others: int, option: float = 3.14):
    """
    this function is on the command line!

    Args:
        required: a required parameter
        not_required: this one isn't required, since it has a default
        *others: all the other positional arguments go here
        option: [-x] an option, short name is in brackets
    """

if __name__ == "__main__":
    arguably.run()

becomes

user@machine:~$ ./readme-1.py -h
usage: readme-1.py [-h] [-x OPTION] required [not-required] [others ...]

this function is on the command line!

positional arguments:
  required             a required parameter (type: str)
  not-required         this one isn't required, since it has a default (type: int, default: 2)
  others               all the other positional arguments go here (type: int)

options:
  -h, --help           show this help message and exit
  -x, --option OPTION  an option, short name is in brackets (type: float, default: 3.14)

It can also easily hand some wild cases, like passing in QEMU-style arguments to build classes:

user@machine:~$ ./readme-2.py --nic tap,model=e1000 --nic user,hostfwd=tcp::10022-:22
nic=[TapNic(model='e1000'), UserNic(hostfwd='tcp::10022-:22')]
🌐
Reddit
reddit.com › r/python › clypi - your all-in-one beautiful, lightweight, type-safe, (and now) prod-ready clis
r/Python on Reddit: clypi - Your all-in-one beautiful, lightweight, type-safe, (and now) prod-ready CLIs
March 29, 2025 -

TLDR: check out clypi - A lightweight, intuitive, pretty out of the box, and production ready CLI library. After >250 commits and a month of development and battle testing, clypi is now stable, ready, and full of new features that no other CLI libraries offer.

---

Hey Reddit, I heard your feedback on my previous post. After a month of development, clypi is stable, ready to be used, and full of new features that no other CLI library offers.

Comparison:

I've been working with Python-based CLIs for several years with many users and strict quality requirements and always run into the sames problems with the go-to packages:

  • Argparse is the builtin solution for CLIs, but, as expected, it's functionality is very restrictive. It is not very extensible, it's UI is not pretty and very hard to change, lacks type checking and type parsers, and does not offer any modern UI components that we all love.

  • Rich is too complex and verbose. The vast catalog of UI components they offer is amazing, but it is both easy to get wrong and break the UI, and too complicated/verbose to onboard coworkers to. It's prompting functionality is also quite limited and it does not offer command-line arguments parsing.

  • Click is too restrictive. It enforces you to use decorators, which is great for locality of behavior but not so much if you're trying to reuse arguments across your application. It is also painful to deal with the way arguments are injected into functions and very easy to miss one, misspell, or get the wrong type. Click is also fully untyped for the core CLI functionality and hard to test.

  • Typer seems great! I haven't personally tried it, but I have spent lots of time looking through their docs and code. I think the overall experience is a step up from click's but, at the end of the day, it's built on top of it. Hence, many of the issues are the same: testing is hard, shared contexts are untyped, their built-in type parsing is quite limited, and it does not offer modern features like suggestions on typos. Using Annotated types is also very verbose inside function definitions.

What My Project Does:

Here are clypi's key features:

  • Type safe: making use of dataclass-like commands, you can easily specify the types you want for each argument and clypi automatically parses and validates them.

  • Asynchronous: clypi is built to run asynchronously to provide the best performance possible when re-rendering.

  • Easily testable: thanks to being type checked and to using it's own parser, clypi let's you test each individual step. From from parsing command-line arguments to running your commands in tests just like a user would.

  • Composable: clypi lets you easily reuse arguments across subcommands without having to specify them again.

  • Configurable: clypi lets you configure almost everything you'd like to configure. You can create your own themes, help pages, error messages, and more!

Please, check out the GitHub repo or docs for a showcase and let me know your thoughts and what you think of it when you give it a go!

Target Audience

clypi can be used by anyone who is building or wants to build a CLI and is willing to try a new project that might provide a better user experience than the existing ones. My peers seem very happy with the safety guarantees it provides and how truly customizable the entire library is.

🌐
Medium
medium.com › geekculture › 7-python-cli-library-you-should-know-cba23c873b34
7 Best Python CLI library You Should Know | by Farhan Tanvir | Geek Culture | Medium
October 27, 2022 - According to me, a good project uses some of the best libraries available · I do not think Python needs any introduction. It is one of the most used programming languages for almost every purpose. Here I have compiled 7 useful Python libraries for CLI that will help you in your development journey.
🌐
Reddit
reddit.com › r/python › the best python cli library, arguably.
r/Python on Reddit: The best Python CLI library, arguably.
May 17, 2024 -

What My Project Does

https://github.com/treykeown/arguably

arguably makes it super simple to define complex CLIs. It uses your function signatures and docstrings to set everything up. Here's how it works:

  • Adding the @arguably.command decorator to a function makes it appear on the CLI.

  • If multiple functions are decorated, they'll all be set up as subcommands. You can even set up multiple levels of subcommands.

  • The function name, signature, and docstring are used to automatically set up the CLI

  • Call arguably.run() to parse the arguments and invoke the appropriate command

A small example:

#!/usr/bin/env python3
import arguably

@arguably.command
def some_function(required, not_required=2, *others: int, option: float = 3.14):
    """
    this function is on the command line!

    Args:
        required: a required argument
        not_required: this one isn't required, since it has a default value
        *others: all the other positional arguments go here
        option: [-x] keyword-only args are options, short name is in brackets
    """
    print(f"{required=}, {not_required=}, {others=}, {option=}")

if __name__ == "__main__":
    arguably.run()

becomes

user@machine:~$ ./readme-1.py -h
usage: readme-1.py [-h] [-x OPTION] required [not-required] [others ...]

this function is on the command line!

positional arguments:
  required             a required parameter (type: str)
  not-required         this one isn't required, since it has a default (type: int, default: 2)
  others               all the other positional arguments go here (type: int)

options:
  -h, --help           show this help message and exit
  -x, --option OPTION  an option, short name is in brackets (type: float, default: 3.14)

It can easily hand some very complex cases, like passing in QEMU-style arguments to automatically instantiated different types of classes:

user@machine:~$ ./readme-2.py --nic tap,model=e1000 --nic user,hostfwd=tcp::10022-:22
nic=[TapNic(model='e1000'), UserNic(hostfwd='tcp::10022-:22')]

You can also auto-generate a CLI for your script through python3 -m arguably your_script.py, more on that here.

Target Audience

If you're writing a script or tool, and you need a quick and effective way to run it from the command line, arguably was made for you. It's great for things where a CLI is essential, but doesn't need tons of customization. arguably makes some opinionated decisions that keep things simple for you, but doesn't expose ways of handling things like error messages.

I put in the work to create GitHub workflows, documentation, and proper tests for arguably. I want this to be useful for the community at large, and a tool that you can rely on. Let me know if you're having trouble with your use case!

Comparison

There are plenty of other tools for making CLIs out there. My goal was to build one that's unobtrusive and easy to integrate. I wrote a whole page on the project goals here: https://treykeown.github.io/arguably/why/

A quick comparison:

  • argparse - this is what arguably uses under the hood. The end user experience should be similar - arguably just aims to make it easy to set up.

  • click - a powerhouse with all the tools you'd ever want. Use this if you need extensive customization and don't mind some verbosity.

  • typer - also a great option, and some aspects are similar design-wise. It also uses functions with a decorator to set up commands, and also uses the function signature. A bit more verbose, though like click, has more customization options.

  • fire - super easy to generate CLIs. arguably tries to improve on this by utilizing type hints for argument conversion, and being a little more of a middle ground between this and the more traditional ways of writing CLIs in Python.

This project has been a labor of love to make CLI generation as easy as it should be. Thanks for checking it out!

🌐
Openbase
openbase.com › categories › python › best-python-cli-libraries
7 Best Python CLI Libraries in 2023 | Openbase
A comparison of the 7 Best Python CLI Libraries in 2023: copier, cement, prompt-toolkit, typer, click and more
🌐
Towards Data Science
towardsdatascience.com › home › latest › typer – probably the simplest to use python command-line interface library
Typer - Probably The Simplest To Use Python Command-Line Interface Library | Towards Data Science
January 22, 2025 - The module is indeed easy to use but also has some drawbacks. Therefore, in this article, I’ll introduce a 3rd party library called Typer, which I believe is probably one of the best for developing a Python CLI program.
🌐
LinuxLinks
linuxlinks.com › home › 13 best free and open source command-line python application development tools
13 Best Free and Open Source Command-Line Python Application Development Tools - LinuxLinks
March 13, 2026 - Python comes with several different libraries that allow you to write a command line interface for your scripts, but argparse, click and docopt are popular ways to create a CLI in Python.
🌐
Medium
medium.com › codex › 7-best-python-cli-library-you-should-know-in-2023-7c527216966
7 Best Python CLI library You Should Know in 2023 | by Farhan Tanvir | CodeX | Medium
April 22, 2023 - This is one of the most starred libraries with over 10.5k stars on GitHub. This library will help you to build CLI applications that users will love using and developers will love creating. It provides a simple way to build CLI apps in Python, with automatic help generation, completion, and conversion of inputs and outputs.
🌐
Reddit
reddit.com › r/python › what is your go-to cli library?
r/Python on Reddit: What is your go-to CLI library?
June 27, 2017 -

I have been using simple argparse to create different tools, and from time to time I came across different "frameworks" or libraries that can help create very pretty command line interfaces.

I'm about start working on a new tool that basically wraps a set of REST API calls, and wondering what is your go to framework when making Cli tools. I'd hope to get a nice help menu as well as possibly some autocomplete support.

🌐
Reddit
reddit.com › r/python › what cli libraries do you use to build your own custom commands?
r/Python on Reddit: What CLI libraries do you use to build your own custom commands?
October 14, 2022 -

I'm working on a side project that converts a python CLI command into both a web form and API using AWS Lambda under the hood. In order to create the API and form, I need metadata about the CLI command (arguments, options, types, etc). Right now, I'm building it specifically for the Click library because it provides a way to export command metadata. However, I'd be interested to know if there's any other CLI libraries that I should think about supporting. Do you use a library other than Click? Which one?

Thanks!!