I have a small program that uses argparse and a positional argument. I'm trying to allow that argument to be set by using an environment variable, but are not getting it to work.
I have seen this post: Setting options from environment variables when using argparse which mentions the same problem, but not for positional arguments.
This is the code so far:
import argparse
import os
class EnvDefault(argparse.Action):
  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)
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('testvar', help="Test variable", action=EnvDefault, envvar='TEST_VAR')
    parser.add_argument('--othervar', help="Other variable", action='store_true')
    args = parser.parse_args()
    if not args.testvar: exit(parser.print_usage())
    print args.testvar
Which returns this:
$ TEST_VAR="bla" ./test.py 
usage: test.py [-h] [--othervar] testvar
test.py: error: too few arguments
 
     
     
    