2011-02-18 10 views
11

Estoy teniendo problemas con este código getopt() en un script que estoy escribiendo que hace un poco de manipulación de archivos dado 2 parámetros necesarios (nombre de archivo de entrada y salida) y/o 2 argumentos opcionales/situacionales (depuración o ayuda).getopt() no aplica los argumentos necesarios?

Código es:

def main(argv): 
    try: 
     opts, args = getopt.getopt(argv, "i:o:dh", ["input-file=", "output-file=", "debug", "help"]) 
    except getopt.GetoptError: 
     usage() 
     sys.exit(2) 

    for opt, arg in opts: 
     if opt in ("-h", "--help"): 
      usage() 
      sys.exit() 
     elif opt in ("-d", "--debug"): 
      global _debug 
      _debug = 1 
     elif opt in ("-i", "--input-file"): 
      u_input_file_name = arg 
     elif opt in ("-o", "--output-file"): 
      u_output_file_name = arg 

De acuerdo con la getopt() documentación:

opciones que requieren un argumento seguido de dos puntos (':'; es decir, el mismo formato que Unix getopt() usos).

El problema es que, como yo lo entiendo, las variables/args seguido de un : deben aplicarse según sea necesario ... pero las opciones i y o no se están aplicando. La ejecución de este fragmento Garners un error sobre u_input_file_name que se hace referencia antes de ser asignado:

[[email protected] ~/python]$ ./inco_add_cm_mpscli.py -o google 
Traceback (most recent call last): 
    File "./inco_add_cm_mpscli.py", line 57, in <module> 
    main(sys.argv[1:]) 
    File "./inco_add_cm_mpscli.py", line 25, in main 
    infile = open(u_input_file_name, 'r') 
UnboundLocalError: local variable 'u_input_file_name' referenced before assignment 

¿Qué estoy haciendo mal?

Respuesta

16

Una opción seguida de dos puntos solo significa que necesita un argumento. No significa que la opción se aplica. Debe escribir su propio código para exigir la existencia de opciones/argumentos.

+0

¿Cuál es el propósito de las opciones que delimitan que ** requiere ** un argumento si el requisito no se trata? –

+1

Porque cuando getopt() analiza la línea de comando, necesita saber que un token es el argumento de la opción anterior o es un nuevo argumento/opción. Por lo tanto, en su ejemplo, no exige que aparezca -i o -o, pero una vez que aparece -i o -o, Python trata el token inmediatamente después como argumento. – evergreen

+0

¿No identifica el token como precedido por - o - para opciones largas o cortas en consecuencia? –

2

Así como una nota, encontré argparse es simple y útil que getopt, y se apoyan argumennts requeridos

http://docs.python.org/2/howto/argparse.html#id1

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("echo", help="echo the string you use here") 
args = parser.parse_args() 

línea de comandos

$ python prog.py 
usage: prog.py [-h] echo 
prog.py: error: the following arguments are required: echo 
Cuestiones relacionadas