繁体   English   中英

Python argparse:args 没有属性 func

[英]Python argparse: args has no attribute func

介绍

我是学校项目的麻烦。 我正在制作一个测试服,我需要一个配置生成界面和一个测试运行器。 为此,我使用了库argparse和两个子解析器cgirun

问题本身

所以这是失败的代码部分:

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 -V
Python 3.6.4

argparse 版本

$ 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: tw@waldmann-edv.de
License: Python Software Foundation License
Location: /usr/lib/python3.6/site-packages
Requires: 

编辑

如果我手动安装 argparse 它将工作sudo pip install argparse 但是有没有任何本地解决方案。 我不确定它是否可以在学校的计算机上运行(我们不能安装软件包)

编辑 2

好吧,我的错,我一直是个白痴,我没有重写我的运行脚本,所以我忘记输入runcgi

感谢您阅读我的信息以及您未来的帮助:)

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

恕我直言比尝试更好......除了

这是argparse的Python 3版本( https://bugs.python.org/issue16308 )中的一个已知错误。 在Python 2中,如果调用脚本时不带任何参数(即,没有子命令),则脚本将干净退出,并显示“错误:参数太少”。 但是,在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()

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

添加

args = parser.parse_args()
try:
    args.func(args)
except AttributeError:
    parser.print_help()
    parser.exit()

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

您必须使子解析器无需参数即可调用脚本。 为此,您必须为parser.add_subparsers指定destrequired参数:

parser = argparse.ArgumentParser()
subparser = parser.add_subparsers(dest='cmd', required=True)

请注意,对于 Python 3.6 及更早版本,没有required参数,您必须为子subparser对象显式设置它:

subparser.required = True

此 SO 答案中提供了详细信息: Argparse with required subparser

或者,将@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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM