Skip to content

Instantly share code, notes, and snippets.

@posilva
Last active June 1, 2021 12:12
Show Gist options
  • Save posilva/f1f02c05d62e4b26631650bdc5cba8db to your computer and use it in GitHub Desktop.
Save posilva/f1f02c05d62e4b26631650bdc5cba8db to your computer and use it in GitHub Desktop.
Python Cli Template
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
This console application description
EXAMPLE:
python3 {}
""".format(__file__)
__author__ = "posilva@gmail.com"
__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