2012-07-22 24 views
6

Tengo que ingresar los parámetros desde la línea de comandos, es decir, nombre de usuario, contraseña y nombre de la base de datos. Sé cómo hacerlo sin usar banderas, usando 'sys.argv' (como a continuación).Agregar argumentos de línea de comandos con indicadores en Python3

##Test.py 
hostname = str(sys.argv[1]) 
username = str(sys.argv[2]) 
password = str(sys.argv[3]) 

def ConnecttoDB(): 
    try: 
     con=sql.connect(host=hostname, user= username, passwd= password) 
     print ('\nConnected to Database\n') 

# If we cannot connect to the database, send an error to the user and exit the program. 
    except sql.Error: 
     print ("Error %d: %s" % (sql.Error.args[0],sql.Error.args[1])) 
     sys.exit(1) 

    return con 

Por lo tanto, podría ser ejecutado como:

$ test.py BASE DE DATOS NOMBRE DE USUARIO pasword

Pero el problema es que tengo que usar 'banderas'. Por lo tanto, la secuencia de comandos se puede ejecutar la siguiente manera:

$test.py -db DATABSE -u USERNAME -p PASSWORD -size 20 

¿Cómo puedo usar banderas para tomar argumentos de línea de comandos? Agradecería tu ayuda en esto.

Respuesta

6

Ante todo gracias a la marca para el código 'argparse'. He descubierto la forma de tomar argumentos de la línea de comandos especificada por flags. Estoy pegando el siguiente código que utiliza una versión modificada de la 'Marca' y un pequeño módulo que muestra cómo utilizar los argumentos recogidos a través de comandos:

import argparse 

parser = argparse.ArgumentParser() 

#-db DATABASE -u USERNAME -p PASSWORD -size 20000 
parser.add_argument("-host", "--hostname", dest = "hostname", default = "xyz.edu", help="Server name") 
parser.add_argument("-db", "--database", dest = "db", default = "ding_dong", help="Database name") 
parser.add_argument("-u", "--username",dest ="username", help="User name") 
parser.add_argument("-p", "--password",dest = "password", help="Password") 
parser.add_argument("-size", "--binsize",dest = "binsize", help="Size", type=int) 

args = parser.parse_args() 

print("Hostname {} db {} User {} Password {} size {} ".format(
     args.hostname, 
     args.db, 
     args.username, 
     args.password, 
     args.binsize 
     )) 
def ConnectToDB(): 
    print ('Trying to connect to mySQL server') 
    # Try to connect to the database 
    try: 
     con=sql.connect(host=args.hostname, user= args.username, passwd= args.password) 
     print ('\nConnected to Database\n') 

    # If we cannot connect to the database, send an error to the user and exit the program. 
    except sql.Error: 
     print ("Error %d: %s" % (sql.Error.args[0],sql.Error.args[1])) 
     sys.exit(1) 

    return con 

Uno de mi preocupación era cómo utilizar las variables de argumentos para el código . Para eso hay que hacer dos cosas

  1. Agregar 'dest' a la línea add_argument e.x. dest = "username" que significa que el valor recolectado de la línea comamnd se asignará a la variable 'username'
  2. Siempre que utilice tales variables asignadas de línea de comando desde 'dest' simplemente agregue 'args' antes de la variable ex con = sql.connect (host = args.hostname, user = args.username, passwd = args.password)

Hecho

Gracias

AK

+0

http://docs.python.org/3/library/argparse.html para los detalles – Urhixidur

+7

Usted aceptó su propia solución problema, mientras que ** @ Mark ** le proporcionó una respuesta a su pregunta. No estoy seguro si esto es muy amable ... – Atcold

31

La biblioteca python 3 incluye 3 módulos para analizar la línea de comandos y, por lo tanto, nada más para agregar a su configuración.

El que se debe utilizar es argparse

import argparse 
parser = argparse.ArgumentParser() 

#-db DATABSE -u USERNAME -p PASSWORD -size 20 
parser.add_argument("-db", "--hostname", help="Database name") 
parser.add_argument("-u", "--username", help="User name") 
parser.add_argument("-p", "--password", help="Password") 
parser.add_argument("-size", "--size", help="Size", type=int) 

args = parser.parse_args() 

print("Hostname {} User {} Password {} size {} ".format(
       args.hostname, 
     args.username, 
     args.password, 
     args.size 
     )) 
+0

Gracias por su respuesta y el código. El problema al que me enfrento ahora es que mi código está dando error 'Variables indefinidas' para las variables definidas en el código anterior. Esto se debe a que, antes, sus valores se mencionaban explícitamente dentro del script, pero después de incluir el código por Mark, el script no reconoce los valores. En resumen, ¿cómo hago que el script tome valores de variables del módulo 'argparse'? Por ej. anterior en el script: nombre de host = 127.0.0.1, nombre de usuario = xyz y contraseña = abc pero ahora estos fueron reemplazados por el código anterior (por Mark), por lo tanto el script ahora dice 'Variables no definidas'. –

Cuestiones relacionadas