2016-10-02 3 views
0

also an einer Aufgabe arbeite ich in einer Python-Klasse, die ich nehme, habe aber mit etwas stecken geblieben wir nicht wirklich keine weiteren Informationen über (weder auf SO, Google finden können oder in der Kursunterlagen).Getopt mehr Argumente Syntaxen

Ich brauche Hilfe mit, wie Argumente mit mehreren Arten von Syntaxen zu handhaben - wie [arg] und < arg>, das ist etwas, das ich nicht in der Lage gewesen bin über weitere Informationen zu finden. Hier

ist ein Beispiel Use-Case, das funktionieren soll.

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

Der Code unten arbeitet für jeden Anwendungsfall in Ordnung, wenn ich keine weiteren Ausgang definiert haben als auf der Konsole zu schreiben:

# 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]) 

Beispiel Nutzung:

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

Und Dies ist ein Ausschnitt, der zeigt, wie der Ping funktioniert:

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))) 
+0

was ist Ihre Frage genau? Möchtest du '--output' zu deinem getopt parsing hinzufügen? –

+0

Ich dachte, die Frage sei offensichtlich ... Ich muss mit mehreren Argumentsyntaxen umgehen, wobei das Argument (s) entweder in [/] oder <> – geostocker

+0

sein sollte. Sind Sie verpflichtet, 'getopt' zu verwenden? Denn 'argparse' ist viel mächtiger und bietet eine großartige Syntax für diese Fälle, ohne dass Sie alles selbst parsen müssen. – poke

Antwort

1

[] und <> werden häufig verwendet, um visuell Option Anforderung anzuzeigen. Normalerweise bedeutet [xxxx], dass die Option oder das Argument optional ist und <xxxx> erforderlich ist.

Der Beispielcode Sie Griffe bieten Option Fahnen, aber nicht die erforderlichen Argumente. Code unten sollte Sie in die richtige Richtung beginnen.

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))) 
Verwandte Themen