Skip to content

Instantly share code, notes, and snippets.

@josemarcosrf
Forked from orls/EnvDefault.py
Created October 25, 2018 14:34
Show Gist options
  • Save josemarcosrf/096442059373312bda1aa0312099c537 to your computer and use it in GitHub Desktop.
Save josemarcosrf/096442059373312bda1aa0312099c537 to your computer and use it in GitHub Desktop.
Using env vars in argparse
import argparse
from EnvDefault import env_default
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="use env vars as defaults for argparse"
)
parser.add_argument(
"--alpha", "-a",
action=env_default('ALPHA'),
required=False,
help="""Optional. Value from CLI will be used if present, or from env var ALPHA.
If neither of these is present, value is None becasue no fallback default
was given"""
)
parser.add_argument(
"--beta", "-b",
action=env_default('BETA'),
required=True,
help="""Required. Value from CLI will be used if present, or from env var BETA.
If neither of these is present, it's an error"""
)
parser.add_argument(
"--gamma", "-g",
action=env_default('GAMMA'),
required=True,
default=9001,
help="""Value from CLI will be used if present, or from env var GAMMA.
If neither of these is present, default of 9001 is used"""
)
print parser.parse_args()
"""Provides a utility to inject environment variables into argparse definitions.
Currently requires explicit naming of env vars to check for"""
import argparse
import os
# Courtesy of http://stackoverflow.com/a/10551190 with env-var retrieval fixed
class EnvDefault(argparse.Action):
"""An argparse action class that auto-sets missing default values from env
vars. Defaults to requiring the argument."""
def __init__(self, envvar, required=True, default=None, **kwargs):
if not default and envvar:
if envvar in os.environ:
default = os.environ[envvar]
if required and default:
required = False
super(EnvDefault, self).__init__(default=default, required=required,
**kwargs)
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, values)
# functional sugar for the above
def env_default(envvar):
def wrapper(**kwargs):
return EnvDefault(envvar, **kwargs)
return wrapper
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment