2012-03-29 28 views
2

ich eine Frage bezüglich Geben von Argumenten in Python.for Ex haben: im Skript Ich erwarte Argumente wiePython analysieren Argumente von der Kommandozeile

1.python run.py -create vairbale1 -reference variable2 many more variables 
2.python run.py -get -list variable many more variable 

Wie kann ich dies in dem Skript optparse oder getopt enfore und Wenn die Argumente ungültig sind, muss ich ungültige Argumente drucken

from optparse import OptionParser 

parser = OptionParser() 
+3

FYI zu bestätigen: Die 'optparse' Modul abgeschrieben wurde. Ab 2.7 werden Sie wahrscheinlich das Modul 'argparse' verwenden wollen: http://docs.python.org/library/argparse.html#module-argparse –

Antwort

3

Hier ist ein Ausschnitt, den ich verwendet habe. Ich habe für mich gearbeitet, obwohl Sie möglicherweise die Parametertypen ändern müssen.

parser = OptionParser() 
parser.add_option('-n', '--db_name', help='DB Name (comma separated if multiple DBs - no spaces)') 
parser.add_option('-H', '--db_host', help='DB host (comma separated if multiple DBs - no spaces)') 
parser.add_option('-p', '--db_port', help='DB port (optional)') 
parser.add_option('-u', '--db_user', help='DB user') 
parser.add_option('-w', '--db_pass', help='DB password') 
parser.add_option('-o', '--output-file', help='output file') 

options, args = parser.parse_args() 

errors = [] 
error_msg = 'No %s specified. Use option %s' 
if not options.db_name: 
    errors.append(error_msg % ('database name', '-n')) 
if not options.db_host: 
    errors.append(error_msg % ('database host', '-H')) 
if not options.db_user: 
    errors.append(error_msg % ('database user', '-u')) 
if not options.db_pass: 
    errors.append(error_msg % ('database password', '-w')) 
if not options.output_file: 
    errors.append(error_msg % ('output file', '-o')) 

if errors: 
    print '\n'.join(errors) 
    sys.exit(1) 
+0

Canu bitte erklären Sie für ein Beispiel, wie Sie es verwenden möchten – Rajeev

+0

Sie führen das Skript Python blah.py -n DB-Name - H dbhost -p 8080 -u dbuser -w dbpass -o Pfad_zur_Datei dann im Code können Sie die Werte zugreifen mit Optionen.db_name zum Beispiel – Nostradamnit

+0

K.Along mit -n DBName, wenn ich einen weiteren Parameter übergeben muss. Wie kann ich es im Code ändern? parser.add_option ('- n', '--db_name', 'var1', help = 'DB Name (durch Komma getrennt, wenn mehrere DBs ...) – Rajeev

2

Sie benutzerdefinierte Aktion verwenden können, um Daten wie

import argparse 
import re 

class ValidateEmailAction(argparse.Action): 
    ''' 
    Function will not validate domain names. 
    e.g. [email protected] is valid here. 
    ''' 
    def __call__(self, parser, namespace, values, option_string=None): 

     super(argparse.Action, self).__call__(parser, namespace, values, 
                option_string=option_string) 
     email = values 
     pattern = "^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$" 
     if not re.match(pattern, email) != None: 
      raise AttributeError 


parser = argparse.ArgumentParser() 
parser.add_argument('-e', '--email', action=ValidateEmailAction, help='Enter valid email.') 

Überprüfen Sie auch die benutzerdefinierte Aktion auf http://docs.python.org/dev/library/argparse.html#action

+0

k danke für das Beispiel..nice .. – Rajeev

+1

Ihr Code wirft Fehler, selbst wenn ich korrekte E-Mail-Adresse eingeben: ' super (argparse .Action, self) .__ Aufruf __ (Parser, Namespace, Werte, AttributeError: 'super' Objekt hat kein Attribut '__call __' ' –

+0

Das könnte eine neue Änderung sein. Ich werde Sie nach dem Überprüfen neuer Änderungen in 'argparse.Action' aktualisieren – Nilesh

Verwandte Themen