我在学校项目上遇到麻烦。我正在制作一个测试服,我需要机器人配置生成界面和测试运行器。为此我使用了库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
感谢您阅读我的留言和未来的帮助:)
答案 0 :(得分:4)
parser = ArgumentParser()
parser.set_defaults(func=lambda args: parser.print_help())
imho比try..except更好
答案 1 :(得分:2)
这是argparse(https://bugs.python.org/issue16308)的Python 3版本中的一个已知错误。在Python 2中,如果调用脚本时不带任何参数(即,没有子命令),则脚本将以“错误:参数太少”干净地退出。但是,在Python3中,您会得到未处理的AttributeError
。幸运的是,解决方法非常简单:
try:
func = args.func
except AttributeError:
parser.error("too few arguments")
func(args)
答案 2 :(得分:0)
另一个解决方案可能是:
if len(args.__dict__) <= 1:
# No arguments or subcommands were given.
parser.print_help()
parser.exit()
答案 3 :(得分:0)
或者,@ 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()
答案 4 :(得分:0)
此错误仅在直接运行“ 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”的情况。 它解决了我的问题,非常感谢!
答案 5 :(得分:0)
您将需要使子解析器不带参数地调用脚本。为此,您必须为dest
指定required
和parser.add_subparsers
参数:
parser = argparse.ArgumentParser()
subparser = parser.add_subparsers(dest='cmd', required=True)
请注意,对于Python 3.6和更早版本,没有required
参数,您必须为subparser
对象显式设置它:
subparser.required = True
有关此SO解答的详细信息,请访问:Argparse with required subparser