Last active
June 1, 2021 12:12
-
-
Save posilva/f1f02c05d62e4b26631650bdc5cba8db to your computer and use it in GitHub Desktop.
Python Cli Template
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
""" | |
This console application description | |
EXAMPLE: | |
python3 {} | |
""".format(__file__) | |
__author__ = "[email protected]" | |
__version__ = "0.1.0" | |
__date__ = "2020-11-06" | |
__version_text__ = "(version {version} [{date}])".format( | |
version=__version__, date=__date__) | |
__epilog__ = "{author} {version}".format( | |
author=__author__, version=__version_text__) | |
import argparse | |
import os | |
import getpass | |
import logging | |
import sys | |
def exit(msg, *args, **kwargs): | |
logging.fatal(msg, *args, **kwargs) | |
sys.exit(1) | |
def from_arg_or_env(arg, env_var, arg_name): | |
if arg is None: | |
logging.debug("'{}' argument missing, fetching from environment variable '{}' ".format(arg_name, env_var)) | |
if os.environ.get(env_var) is None: | |
exit("failed to fetch '{}' from enviroment variable '{}'".format(arg_name, env_var)) | |
else: | |
return os.environ.get(env_var) | |
return arg | |
def from_env_or_ask(env_key, secure=False): | |
prompt = "Enter {text}: ".format(text=env_key) | |
if os.environ.get(env_key) is None: | |
if (secure): | |
return getpass.getpass(prompt=prompt) | |
else: | |
return input(prompt) | |
def add_arg(parser, longname, help, action="store", required=True, short=None, default=None): | |
s = longname[0:] | |
if short is not None: | |
s = short | |
import re | |
longname = re.sub('[ -]', '_', longname) | |
parser.add_argument( | |
"-{}".format(s), | |
"--{}".format(longname), | |
action=action, | |
dest=longname, | |
required=required, | |
default=default, | |
help=help) | |
################################################################# | |
# DO SOME WORK START HERE | |
################################################################# | |
def add_custom_args(parser): | |
''' | |
Add here the custom args for this cli app | |
''' | |
add_arg(parser, "arg", "arg_var", required=False, short="a") | |
def do_work(args): | |
logging.debug("doing some work") | |
################################################################# | |
# DO SOME WORK END | |
################################################################# | |
def main(args): | |
log_level = logging.DEBUG if args.verbose > 0 else logging.ERROR | |
logging.basicConfig(level=log_level) | |
logging.debug("processing with args: ini: {}".format(args)) | |
do_work(args) | |
if __name__ == "__main__": | |
parser = argparse.ArgumentParser( | |
description=__doc__, | |
formatter_class=argparse.RawDescriptionHelpFormatter, | |
epilog=__epilog__) | |
add_custom_args(parser) | |
parser.add_argument( | |
"-v", | |
"--verbose", | |
action="count", | |
default=0, | |
help="Verbosity (-v, -vv, etc)") | |
parser.add_argument( | |
"--version", | |
action="version", | |
version="%(prog)s {version_text}".format( | |
version_text=__version_text__)) | |
args = parser.parse_args() | |
main(args) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment