Python argparse:args没有func属性 简介

Python argparse:args没有func属性 简介,python,Python,我为一个学校项目感到麻烦。我正在做一套测试服,我需要一个配置生成界面和一个测试运行程序。为此,我使用了库argparse和两个子parsercgi和run 问题本身 下面是失败代码部分: def CGI(args): print("CGI: Work In Progress") exit(0) def runTest(args): print("Run: Work in Progress") exit(0) parser = argparse.Argumen

我为一个学校项目感到麻烦。我正在做一套测试服,我需要一个配置生成界面和一个测试运行程序。为此,我使用了库
argparse
和两个子parser
cgi
run

问题本身 下面是失败代码部分:

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
无论何时运行此代码,都会出现以下错误:

  File "/home/thor/Projects/EPITA/TC/test/test.py", line 44, in main
    args.func(args)
AttributeError: 'Namespace' object has no attribute 'func'
Python版本 Argparse版本 编辑 如果我手动安装argparse,它将工作
sudopip安装argparse
。但是否有任何本地解决方案。我不确定它是否能在学校的电脑上运行(我们可以安装软件包)

编辑2 好吧,糟糕,我一直是个十足的白痴,我没有重写我的运行脚本,所以我忘了输入
run
cgi


感谢您阅读我的消息和您将来的帮助:)

这是Python 3版本的argparse()中的一个已知错误。在Python2中,如果调用脚本时没有任何参数(即,没有子命令),那么它将以“error:too limit arguments”干净地退出。然而,在Python3中,您会得到一个未处理的
AttributeError
。幸运的是,解决方法非常简单:

    try:
        func = args.func
    except AttributeError:
        parser.error("too few arguments")
    func(args)

另一个解决办法可以是:

if len(args.__dict__) <= 1:
    # No arguments or subcommands were given.
    parser.print_help()
    parser.exit()

如果len(args.\uuu dict\uuu)或@simleo和@nehaljwani的答案的组合:

    # Parse the arguments and call the sub command
    args = parser.parse_args()
    try:
        args.func(args)
    except AttributeError:
        parser.print_help()
        parser.exit()

此错误仅在直接运行“python script.py”时发生。 “pythonscript.py--help”工作正常

将帮助您处理直接运行“python script.py”的情况。 它解决了我的问题,非常感谢

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

我认为比try更好。除了

您必须创建子parser,才能调用不带参数的脚本。为此,必须为
解析器指定
dest
必需的
参数。添加子解析器

parser = argparse.ArgumentParser()
subparser = parser.add_subparsers(dest='cmd', required=True)
请注意,对于Python 3.6和更早版本,没有
必需的
参数,您必须为
子parser
对象显式设置它:

subparser.required = True

详细信息可在此SO答案中找到:

是的,没错。您了解了子parser(包括它们的默认值)只有在参数中存在它们各自的命令时才会运行的艰难过程。请注意,您可以回答自己的问题。
parser = ArgumentParser()
parser.set_defaults(func=lambda args: parser.print_help())
parser = argparse.ArgumentParser()
subparser = parser.add_subparsers(dest='cmd', required=True)
subparser.required = True