Python中的参数解析(必需与可选) [英] Argument parsing in Python (required vs. optional)

查看:95
本文介绍了Python中的参数解析(必需与可选)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在处理一个脚本,该脚本可以带有多个标志.我希望这样,无论最后一个参数是'start | stop | status'.

I'm currently working on a script that will be able to take multiple flags. I want it so that no matter what the last argument should be 'start|stop|status'.

#!/usr/bin/env python

from argparse import ArgumentParser


def argument_analysis():
    """
This will analyze arguments, and return the region as a string, the filter as a dictionary, and the command as a string.
    :return: region,filters,command
    """
    parser_options = ArgumentParser()
    parser_options.add_argument("-r", "--region", dest='region',
                                help="Filter by region.")
    parser_options.add_argument("-n", "--name", dest='name',
                                help="Filter by hostname.")
    parser_options.add_argument("-P", "--project", dest='project',
                                help="Filter by Project tag.")
    parser_options.add_argument("-U", "--usage", dest='usage',
                                help="Filter by Usage tag.")
    parser_options.add_argument("-i", "--instance_id", dest='instance_id',
                                help="Filter by instance_id.")
    parser_options.add_argument("-t", "--type", dest='type',
                                help="Filter by instance_size.")
    parser_options.add_argument("-p", "--ip", dest='internal_ip',
                                help="Filter by internal_ip")
    parser_options.add_argument("-c", "--command", dest='command',
                                help="stop/start, or check the status of instances.")
    parser_options.add_argument("-a", "--all", dest='all', default=False, action='store_true',
                                help="No filter, display status of all servers.")
    arguments = vars(parser_options.parse_args())
    return arguments


if __name__ == '__main__':
    print argument_analysis()

我希望它使./argument_analysis_script.py在结尾处需要"stop | start | status".我不太幸运能获得有关ARgumentParser()的帮助.如果有人有任何建议,那将非常有帮助.

I want it so that ./argument_analysis_script.py will require a 'stop|start|status' at the end. I haven't had much luck getting help with the ARgumentParser(). If anybody has any suggestions it would be very helpful.

提前感谢您的时间.

注意:如果不输入[stop | start | restart | status],我希望脚本停止运行,并说明需要[stop | start | restart | status].

NOTE: I would like for the script to stop if [stop|start|restart|status] is not entered, and explain that [stop|start|restart|status] is required.

** UPDATE ** ** UPDATE ** ** UPDATE **

进行更多挖掘之后,为了能够分析/使用命令行选项和参数,我偶然发现了OptionParser,我避免使用已弃用.无论如何,由于这是我唯一能找到的东西,正是我想要的东西,因此这里是我所拥有的东西的更新:

After doing some more digging, to be able to analyze/use command line options, and arguments, I stumbled upon OptionParser, which I avoided as docs.python.org states it's deprecated. Anyway, since that is the only thing that I could find to give me exactly what I wanted, here is an update of what I've got:

#!/usr/bin/env python

from optparse import OptionParser


def argument_analysis():
    """
This will analyze arguments, and return the region as a string, the filter as a dictionary, and the command as a string.
    :return: region,filters,command
    """
    parser = OptionParser()
    parser.add_option("-r", "--region", dest='region',
                      help="Filter by region.")
    parser.add_option("-n", "--name", dest='name',
                      help="Filter by hostname.")
    parser.add_option("-P", "--project", dest='project',
                      help="Filter by Project tag.")
    parser.add_option("-U", "--usage", dest='usage',
                      help="Filter by Usage tag.")
    parser.add_option("-i", "--instance_id", dest='instance_id',
                      help="Filter by instance_id.")
    parser.add_option("-t", "--type", dest='type',
                      help="Filter by instance_size.")
    parser.add_option("-p", "--ip", dest='internal_ip',
                      help="Filter by internal_ip")
    parser.add_option("-c", "--command", dest='command',
                      help="stop/start, or check the status of instances.")
    parser.add_option("-a", "--all", dest='all', default=False, action='store_true',
                      help="No filter, display status of all servers.")
    (options, args) = parser.parse_args()  # Grab Options specifed from above, as well as actual Arguments.

    options = vars(options)  # Convert 'options' into dictionary: key=dest_name, value=dest_value

    # Getting variables for dictionary below.
    region_filter = options['region']
    name_filter = options['name']
    project_filter = options['project']
    usage_filter = options['usage']
    instance_filter = options['instance_id']
    type_filter = options['type']
    ip_filter = options['internal_ip']
    all_filter = options['all']

    region = region_filter if region_filter else 'us-east-1' # Return 'us-east-1' region is not specified.

    filters = {'tag:Name': name_filter, 'tag:Project': project_filter, 'tag:Usage': usage_filter,
               'instance-id': instance_filter, 'instance_type': type_filter, 'private-ip-address': ip_filter,
               'all': all_filter}

    command = 'No commands.' if not args else args  #Return "No commands" if no command is specified.

    return region, filters, command


if __name__ == '__main__':
    opts_and_args = argument_analysis()
    print "Region: " + str(opts_and_args[0])
    print "Filters: " + str(opts_and_args[1])
    print "Command: " + str(opts_and_args[2])

如您所见,您可以基于返回的对象或在定义中应用任何逻辑.谢谢大家在此方面的协助.

As you can see, you can apply whatever logic you want to based on the returned object, or within the definition. Thanks everybody for your assistance on this one.

推荐答案

也许您可以使用argparse来做到这一点,但是另一种选择是使用sys模块

Maybe you can do this with argparse, but another option is to use the sys module

import sys
print sys.argv # prints command line arguments

sys.argv在列表中具有命令行参数,因此您可以检查最后一个参数:

sys.argv has the command line arguments in a list, so you can check the last one for whatever:

if sys.argv[-1] != 'start':
    print "Error, expected <something>"
    // quit

这篇关于Python中的参数解析(必需与可选)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆