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='+'.

定义的