![](/img/trans.png)
[英]Argparse-AttributeError: '_StoreAction' object has no attribute 'parse_args'
[英]Python argparse: args has no attribute func
我是学校项目的麻烦。 我正在制作一个测试服,我需要一个配置生成界面和一个测试运行器。 为此,我使用了库argparse
和两个子解析器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 -V
Python 3.6.4
$ 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
。 但是有没有任何本地解决方案。 我不确定它是否可以在学校的计算机上运行(我们不能安装软件包)
好吧,我的错,我一直是个白痴,我没有重写我的运行脚本,所以我忘记输入run
或cgi
感谢您阅读我的信息以及您未来的帮助:)
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
指定dest
和required
参数:
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.