Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python argparse: args has no attribute func

Tags:

python

Intro

I'm trouble for a school project. I'm making a testsuit and i'm needing bot a configuration generation interface and a test runner. For that i used the library argparse and two subparsers cgi and run

The issue itself

So here is the failing code section:

def CGI(args):
    print("CGI: Work In Progress")
    exit(0)


def runTest(args):
    print("Run: Work in Progress")
    exit(0)

parser = argparse.ArgumentParser()
subparser = parser.add_subparsers()
cgi = subparser.add_parser("cgi", help="CSV Generator Interface")
run = subparser.add_parser("run", help="Test running")
verbosity = parser.add_argument_group("Verbosity").add_mutually_exclusive_group()
check = run.add_argument_group("Checks")

# Arguments
#Run parser
run.set_defaults(func=runTest)

# Run argument declaration ...

# Verbosity argument declaration ...

# Check argument declaration ...

#CGI
cgi.set_defaults(func=CGI)

args = parser.parse_args()
args.func(args) # Error is here

Whenever i run this code i have the following error:

  File "/home/thor/Projects/EPITA/TC/test/test.py", line 44, in main
    args.func(args)
AttributeError: 'Namespace' object has no attribute 'func'

Python version

$ python -V
Python 3.6.4

Argparse version

$ pip show argparse
Name: argparse
Version: 1.4.0
Summary: Python command-line parsing library
Home-page: https://github.com/ThomasWaldmann/argparse/
Author: Thomas Waldmann
Author-email: [email protected]
License: Python Software Foundation License
Location: /usr/lib/python3.6/site-packages
Requires: 

EDIT

If i install argparse manually it work sudo pip install argparse. But is there any native solution. I'm not sure it will work on school's computers (we can' install packages)

EDIT 2

OK my bad i've been a total idiot i didn't rewrited my running script so i forgot to input run or cgi

Thanks for reading my message and for your future help :)

like image 589
Biboozz Avatar asked Feb 06 '18 16:02

Biboozz


People also ask

How do you add an optional argument in Argparse?

Optional Arguments To add an optional argument, simply omit the required parameter in add_argument() . args = parser. parse_args()if args.

How do I make Argparse argument optional in Python?

Python argparse optional argument The example adds one argument having two options: a short -o and a long --ouput . These are optional arguments. The module is imported. An argument is added with add_argument .

What is Store_true in Python?

The store_true option automatically creates a default value of False. Likewise, store_false will default to True when the command-line argument is not present. The source for this behavior is succinct and clear: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861.


2 Answers

This is a known bug in the Python 3 version of argparse (https://bugs.python.org/issue16308). In Python 2, if the script is called with no arguments whatsoever (i.e., no subcommand), it exits cleanly with "error: too few arguments". In Python3, however, you get an unhandled AttributeError. Luckily, the workaround is pretty straightforward:

    try:
        func = args.func
    except AttributeError:
        parser.error("too few arguments")
    func(args)
like image 64
simleo Avatar answered Sep 17 '22 20:09

simleo


parser = ArgumentParser()
parser.set_defaults(func=lambda args: parser.print_help())

imho better than try..except

like image 30
Anton Vazhnetsov Avatar answered Sep 20 '22 20:09

Anton Vazhnetsov