structure and simplify subcommand handling with argparse
Project description
argparse_subcommand
Library to extend Python argparse stdlib with easy handling of subcommands
Extends argparse.ArgumentParser
with a facility for configuring subcommands by convention.
Each subcommand lives in its separate Python module.
The name of the subcommand is the module name (without superpackage names)
with underscore replaced by dash.
To be a subcommand module, a module must have
import argparse_subcommand as ap_sub
meaning = "some help text for the subcommand"
def add_arguments(parser: ap_sub.ArgumentParser): ... # configure the subcommand's sub-argparser
def execute(args: ap_sub.Namespace): ... # run the subcommand
The module can also optionally have:
aliases = ["subcmd-alias1", "subcmd-alias2"] # optional.
for making available the same subcommand under one or more alternative names (e.g. an abbreviation).
For use, create the parser as usual and then call the submodule scanner:
def main(argv: list[str]):
parser = ap_sub.ArgumentParser(epilog=explanation)
parser.scan("mysubcmds.subcmd1", "mysubcmds.subcmd2") # or provide module object instead of str
args = parser.parse_args(argv[1:])
parser.execute_subcommand(args) # or supply nothing, then parse_args() will be called internally
if __name__ == '__main__':
main(sys.argv)
By convention, the subcommand modules (and only they) all go into a common package. If you do that, you can scan them all at once:
parser.scan("mysubcmds.*", strict=True)
argparse_subcommand
uses only one sub-parser group, so that
subcommands cannot be nested, there is only one level of subcommands.
It will execute importlib.import_module()
on all modules mentioned in a scan()
call as strings.
Multiple calls to scan()
are allowed, each can have one or more arguments.
scan(..., strict=False)
(the default) will ignore non-subcommand modules.
scan(..., trace=True)
produces output helpful for debugging your subcommands setup.
That's all.
Version history
- 1.0, 2023-05:
First release - 1.1, 2024-01:
Error messages and trace messages go to stderr, not stdout.
More informative messages when scanned modules are non-subcommand modules. Small improvements to documentation.
Added version history. - 1.2, 2024-03: Better and clearer pattern for the main routine in the documentation.
- ...
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file argparse_subcommand-1.2.tar.gz
.
File metadata
- Download URL: argparse_subcommand-1.2.tar.gz
- Upload date:
- Size: 4.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.7.1 CPython/3.11.2 Linux/5.10.102.1-microsoft-standard-WSL2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0fb3f2055fd845ba48268879d67ae0632948d379015e2853efb15c38bcc7965a |
|
MD5 | cb11245e3b717f794451b0c6da46b5a4 |
|
BLAKE2b-256 | 55dae4bfceb9698149f8c839b2d91189dc6f95f0f1c35ee94b7eb2b09828ee4b |
File details
Details for the file argparse_subcommand-1.2-py3-none-any.whl
.
File metadata
- Download URL: argparse_subcommand-1.2-py3-none-any.whl
- Upload date:
- Size: 7.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.7.1 CPython/3.11.2 Linux/5.10.102.1-microsoft-standard-WSL2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ce0718bbd51448203adb603af84d0a78bb514a1492bb6ba84bf93dd4fa82b3c5 |
|
MD5 | f58b5bbf7175469c9a7672a043017e56 |
|
BLAKE2b-256 | f7836a153bb8ba00c6616db04ad6a7f40f5bee152485f0d4584b63d55a79acd6 |