【问题标题】:ArgParse ERROR. but working in Test.py fileArgParse 错误。但在 Test.py 文件中工作
【发布时间】:2015-09-03 17:49:43
【问题描述】:

create_assessment 中的我的 test.py 文件(以及所有 CRUD 操作)正在运行,例如填充我创建的database。但是,用于与数据库交互的ArgParse 命令行在create_assessment 中由于category 区域而失败。 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'])

【问题讨论】:

    标签: python oop sqlalchemy argparse traceback


    【解决方案1】:

    问题在于括号中的内容。 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'
    

    【讨论】:

    • 感谢@hpaulj 的明确解释。 nargs='+' 正是我选择做的。更容易和更清洁。
    【解决方案2】:

    您不能在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='+' 定义的,所以所有剩余的参数都作为一个列表分配给最终参数。

    【讨论】:

    • 想通了!我正在添加逗号......哦,男孩。太感谢了! nargs= '+' 是我需要的,实际调用中没有括号
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2022-01-05
    • 2012-11-01
    • 1970-01-01
    • 2021-07-26
    相关资源
    最近更新 更多