Getopt多参数语法

时间:2016-10-02 14:25:49

标签: python python-2.7 python-3.x getopt

所以我正在参加我正在学习的python课程中的作业,但是我已经遇到了一些我无法找到任何进一步信息的事情(无论是在SO,Google还是在课件中)。

我需要有关如何使用多种语法处理参数的帮助 - 例如 [arg]和< arg> ,这是我无法找到任何进一步信息的。

以下是一个应该使用的示例用例。

>>> ./marvin-cli.py --output=<filename.txt> ping <http://google.com>
>>> Syntax error near unexpected token 'newline'

以下代码适用于我没有定义任何进一步输出的用例,而不是写入控制台:

# Switch through all options
try:

    opts, args = getopt.getopt(sys.argv[1:], "hsv", ["help","version","silent", "get=", "ping=", "verbose", "input=", "json"])
    for opt, arg in opts:
        if opt in ("-h", "--help"):
            printUsage(EXIT_SUCCESS)
        elif opt in ("-s", "--silent"):
            VERBOSE = False 
        elif opt in ("--verbose"):
            VERBOSE = True 
        elif opt in ("--ping"):
            ping(arg)
        elif opt in ("--input"):
            print("Printing to: ", arg)
        else:
            assert False, "Unhandled option"


except Exception as err:
    print("Error " ,err)
    print(MSG_USAGE)
    # Prints the callstack, good for debugging, comment out for production
    #traceback.print_exception(Exception, err, None)
    sys.exit(EXIT_USAGE)
#print(sys.argv[1])

使用示例:

>>> ./marvin-cli.py ping http://google.com
>>> Latency 100ms

这是一个显示ping如何工作的片段:

def ping(URL):
    #Getting necessary imports
    import requests
    import time

    #Setting up variables
    start = time.time()
    req = requests.head(URL)
    end = time.time()

    #printing result
    if VERBOSE == False:
        print("I'm pinging: ", URL)
        print("Received HTTP response (status code): ", req.status_code)

    print("Latency: {}ms".format(round((end - start) * 1000, 2)))

1 个答案:

答案 0 :(得分:1)

[]<>通常用于直观地表明选项要求。通常[xxxx]表示选项或参数是可选的,需要<xxxx>

您提供的示例代码处理选项标志,但不处理所需的参数。下面的代码可以帮助您开始正确的方向。

try:
    opts, args = getopt.getopt(sys.argv[1:], "hsv", ["help", "version", "silent", "verbose", "output=", "json"])
    for opt, arg in opts:
        if opt in ("-h", "--help"):
            printUsage(EXIT_SUCCESS)
        elif opt in ("-s", "--silent"):
            VERBOSE = False 
        elif opt in ("--verbose"):
            VERBOSE = True
        elif opt in ("--output"):
            OUTPUTTO = arg
            print("Printing to: ", arg)
        else:
            assert False, "Unhandled option"

    assert len(args) > 0, "Invalid command usage"
    # is there a "<command>" function defined?
    assert args[0] in globals(), "Invalid command {}".format(args[0])

    # pop first argument as the function to call
    command = args.pop(0)
    # pass args list to function
    globals()[command](args)


def ping(args):
    #Getting necessary imports
    import requests
    import time

    # validate arguments
    assert len(args) != 1, "Invalid argument to ping"
    URL = args[0]

    #Setting up variables
    start = time.time()
    req = requests.head(URL)
    end = time.time()

    #printing result
    if VERBOSE == False:
        print("I'm pinging: ", URL)
        print("Received HTTP response (status code): ", req.status_code)

    print("Latency: {}ms".format(round((end - start) * 1000, 2)))