ArgParse 错误。但在 Test.py 文件中工作
ArgParse ERROR. but working in Test.py file
我在 create_assessment
中的 test.py 文件(以及所有 CRUD
操作)正在运行,例如填充我创建的 database
。但是,由于 category
区域,用于与数据库交互的 ArgParse
命令行在 create_assessment
中失败。 Assessment
-Category
共享 多对多关系 。
我认为问题是由于解析器的 category
行(如 TracebackError
所示,但我一直无法弄清楚这个难题。categories
做存在于 db
中,解析器无法识别类别,但可以识别 test.py 文件中的类别。可能是 args = parser.parse_args()
未正确解析。
错误:
(venv)acks-MacBook-Pro:notssdb ack$ notssdb-cmd create_assessment 'Learning new things' 'this' dancinglady 'movie' ['Bats', 'Development', 'Swinging at nothing']
usage: API_ArgParse [-h]
{create_user,retrieve_user,update_user,update_user_lastname,delete_user,create_assessment,retrieve_assessment,update_assessment,delete_assessment,create_video,retrieve_video,update_video,update_video_url,delete_video,create_category,retrieve_category,update_category,delete_category,create_element,retrieve_element,update_element,delete_element,create_assessment_results,retrieve_assessment_results,delete_assessment_results,create_category_rating,retrieve_category_rating,update_category_rating,delete_category_rating,create_element_rating,retrieve_element_rating,update_element_rating,delete_element_rating,create_comment,retrieve_comment,update_comment,delete_comment}
...
API_ArgParse: error: unrecognized arguments: Development, Swinging at nothing]
添加了解析器 = 配置。
代码:
parser = argparse.ArgumentParser(prog='API_ArgParse', description='Create, Read, Update, and Delete (CRUD) Interface Commands for NOTSSdb')
subparsers = parser.add_subparsers(dest='cmd', title='subcommands', description='type subcommand name with -h for more details : e.g. notssdb-cmd create_user -h', help='additional help')
api = ConvenienceAPI()
# Create command for 'assessment'
create_parser = subparsers.add_parser('create_assessment', help='create an assessment')
create_parser.add_argument('name', type=str, help='name of the assessment')
create_parser.add_argument('text', type=str, help='assessment text')
create_parser.add_argument('username', type=str, help='name of user')
create_parser.add_argument('videoname', type=str, help='name of video')
create_parser.add_argument('category_names', type=str, help='list all category names')#THIS LINE
# Parse the arguments
args = parser.parse_args()
api = ConvenienceAPI()
api_method = getattr(api, args.cmd)
arg_dict = vars(args)
del arg_dict['cmd']
api_method(**arg_dict)
Create_assessment 带类别检索的方法(convenience.py - 继承基础):
class ConvenienceAPI(BaseAPI):
def create_assessment(self, name, text, username, videoname, category_names):
user = self.retrieve_user(username)
video = self.retrieve_video(videoname)
cat_objects = [self.retrieve_category(category_name) for category_name in category_names]
return super(ConvenienceAPI, self).create_assessment(name, text, user, video, cat_objects)
类别(base.py)的检索方法:
def retrieve_category(self, something_unique):
if isinstance(something_unique, int):
return self.session.query(Category).\
filter(Category.category_id == something_unique).all() # multiple categories
elif isinstance(something_unique, basestring):
print(something_unique) # added
return self.session.query(Category).\
filter(Category.category_name == something_unique).one()
工作 test.py 文件示例:
api.create_assessment('How to be a leader', 'better decisions', 'wizard', 'good leadership', ['Leadership', 'Decision-Making', 'Teamwork and Communication', 'Situation Awareness'])
问题是括号里的东西。 shell 中的命令行处理器无法识别它们。查看解析所使用的 sys.avgv
。
使用一个仅与 argv
相呼应的简单脚本,您的行将生成:
['echoargv.py', 'create_assessment', 'Learning new things', 'this',
'dancinglady', 'movie', '[Bats,', 'Development,', 'Swinging at nothing]']
注意错误消息中的 2 个字符串:
'Development,'
'Swinging at nothing]'
位置'category_names'得到'[Bats,'
,但没有地方放其他字符串。
在方括号 "['Bats', 'Development', 'Swinging at nothing']"
周围加上额外的引号可以解决这个问题,但将整个事情分配给 'category_names'。然后你必须剥离并解析它。
另一种选择是给'category_names'一个nargs='+'
参数并输入
notssdb-cmd create_assessment 'Learning new things' 'this' dancinglady 'movie' 'Bats', 'Development', 'Swinging at nothing'
您不能在 bash
中使用 Python 列表语法来传递列表。您的程序正在传递以下字符串参数:
Learning new things
this
dancinglady
movie
[Bats,
Development,
Swinging at nothing]
如果您想要 category_names
的多个值,您需要以下参数,定义为 last。
create_parser.add_argument('category_names',
dest='cmd', # since you are trying to access args.cmd later
nargs='+', # need at least one, use * if not required
help='list all category names')
然后用
调用你的程序
$ notssdb-cmd create_assessment 'Learning new things' 'this' dancinglady \
'movie' 'Bats' 'Development' 'Swinging at nothing'
前 5 个参数被分配给前 5 个定义的参数。所有剩余的参数都作为最终参数的列表分配,因为它是用 nargs='+'
.
定义的
我在 create_assessment
中的 test.py 文件(以及所有 CRUD
操作)正在运行,例如填充我创建的 database
。但是,由于 category
区域,用于与数据库交互的 ArgParse
命令行在 create_assessment
中失败。 Assessment
-Category
共享 多对多关系 。
我认为问题是由于解析器的 category
行(如 TracebackError
所示,但我一直无法弄清楚这个难题。categories
做存在于 db
中,解析器无法识别类别,但可以识别 test.py 文件中的类别。可能是 args = parser.parse_args()
未正确解析。
错误:
(venv)acks-MacBook-Pro:notssdb ack$ notssdb-cmd create_assessment 'Learning new things' 'this' dancinglady 'movie' ['Bats', 'Development', 'Swinging at nothing']
usage: API_ArgParse [-h]
{create_user,retrieve_user,update_user,update_user_lastname,delete_user,create_assessment,retrieve_assessment,update_assessment,delete_assessment,create_video,retrieve_video,update_video,update_video_url,delete_video,create_category,retrieve_category,update_category,delete_category,create_element,retrieve_element,update_element,delete_element,create_assessment_results,retrieve_assessment_results,delete_assessment_results,create_category_rating,retrieve_category_rating,update_category_rating,delete_category_rating,create_element_rating,retrieve_element_rating,update_element_rating,delete_element_rating,create_comment,retrieve_comment,update_comment,delete_comment}
...
API_ArgParse: error: unrecognized arguments: Development, Swinging at nothing]
添加了解析器 = 配置。
代码:
parser = argparse.ArgumentParser(prog='API_ArgParse', description='Create, Read, Update, and Delete (CRUD) Interface Commands for NOTSSdb')
subparsers = parser.add_subparsers(dest='cmd', title='subcommands', description='type subcommand name with -h for more details : e.g. notssdb-cmd create_user -h', help='additional help')
api = ConvenienceAPI()
# Create command for 'assessment'
create_parser = subparsers.add_parser('create_assessment', help='create an assessment')
create_parser.add_argument('name', type=str, help='name of the assessment')
create_parser.add_argument('text', type=str, help='assessment text')
create_parser.add_argument('username', type=str, help='name of user')
create_parser.add_argument('videoname', type=str, help='name of video')
create_parser.add_argument('category_names', type=str, help='list all category names')#THIS LINE
# Parse the arguments
args = parser.parse_args()
api = ConvenienceAPI()
api_method = getattr(api, args.cmd)
arg_dict = vars(args)
del arg_dict['cmd']
api_method(**arg_dict)
Create_assessment 带类别检索的方法(convenience.py - 继承基础):
class ConvenienceAPI(BaseAPI):
def create_assessment(self, name, text, username, videoname, category_names):
user = self.retrieve_user(username)
video = self.retrieve_video(videoname)
cat_objects = [self.retrieve_category(category_name) for category_name in category_names]
return super(ConvenienceAPI, self).create_assessment(name, text, user, video, cat_objects)
类别(base.py)的检索方法:
def retrieve_category(self, something_unique):
if isinstance(something_unique, int):
return self.session.query(Category).\
filter(Category.category_id == something_unique).all() # multiple categories
elif isinstance(something_unique, basestring):
print(something_unique) # added
return self.session.query(Category).\
filter(Category.category_name == something_unique).one()
工作 test.py 文件示例:
api.create_assessment('How to be a leader', 'better decisions', 'wizard', 'good leadership', ['Leadership', 'Decision-Making', 'Teamwork and Communication', 'Situation Awareness'])
问题是括号里的东西。 shell 中的命令行处理器无法识别它们。查看解析所使用的 sys.avgv
。
使用一个仅与 argv
相呼应的简单脚本,您的行将生成:
['echoargv.py', 'create_assessment', 'Learning new things', 'this',
'dancinglady', 'movie', '[Bats,', 'Development,', 'Swinging at nothing]']
注意错误消息中的 2 个字符串:
'Development,'
'Swinging at nothing]'
位置'category_names'得到'[Bats,'
,但没有地方放其他字符串。
在方括号 "['Bats', 'Development', 'Swinging at nothing']"
周围加上额外的引号可以解决这个问题,但将整个事情分配给 'category_names'。然后你必须剥离并解析它。
另一种选择是给'category_names'一个nargs='+'
参数并输入
notssdb-cmd create_assessment 'Learning new things' 'this' dancinglady 'movie' 'Bats', 'Development', 'Swinging at nothing'
您不能在 bash
中使用 Python 列表语法来传递列表。您的程序正在传递以下字符串参数:
Learning new things
this
dancinglady
movie
[Bats,
Development,
Swinging at nothing]
如果您想要 category_names
的多个值,您需要以下参数,定义为 last。
create_parser.add_argument('category_names',
dest='cmd', # since you are trying to access args.cmd later
nargs='+', # need at least one, use * if not required
help='list all category names')
然后用
调用你的程序$ notssdb-cmd create_assessment 'Learning new things' 'this' dancinglady \
'movie' 'Bats' 'Development' 'Swinging at nothing'
前 5 个参数被分配给前 5 个定义的参数。所有剩余的参数都作为最终参数的列表分配,因为它是用 nargs='+'
.