Pregunta

Lo que sería una expresión fácil de procesar argumentos de línea de comandos si estoy esperando algo como 001 o 999 (vamos a las expectativas de carrera a 001 ... 999 alcance de este tiempo), y algunos otros argumentos pasados, y le gustaría ignorar cualquier inesperado?

Entiendo que si, por ejemplo, tengo que averiguar si "depuración" se pasó entre los parámetros que va a ser algo así:

if 'debug' in argv[1:]:
  print 'Will be running in debug mode.'

¿Cómo saber si se aprobó 009 o 575?

Todas esas llamadas se espera:

python script.py
python script.py 011
python script.py 256 debug
python script.py 391 xls
python script.py 999 debug pdf

En este punto no me importa acerca de las llamadas por el estilo:

python script.py 001 002 245 568
python script.py some unexpected argument
python script.py 0001
python script.py 02

... primero - a causa de más de un argumento "numérico"; En segundo lugar - a causa de ... bueno, argumentos inesperados; tercero y cuarto -. porque de argumentos no 3-dígitos

¿Fue útil?

Solución

A medida que respondieron otros, optparse es la mejor opción, pero si lo que desea código rápido probar algo como esto:

import sys, re

first_re = re.compile(r'^\d{3}$')

if len(sys.argv) > 1:

    if first_re.match(sys.argv[1]):
        print "Primary argument is : ", sys.argv[1]
    else:
        raise ValueError("First argument should be ...")

    args = sys.argv[2:]

else:

    args = ()

# ... anywhere in code ...

if 'debug' in args:
    print 'debug flag'

if 'xls' in args:
    print 'xls flag'

Editar . He aquí un ejemplo optparse porque muchas personas están respondiendo optparse sin explicar realmente por qué, o explicar lo que tiene que cambiar para que funcione

La razón principal para usar optparse es que le da más flexibilidad para la ampliación posterior, y le da más flexibilidad en la línea de comandos. En otras palabras, las opciones pueden aparecer en cualquier orden mensajes y el uso son generados automáticamente. Sin embargo, para que funcione con optparse necesita cambiar sus especificaciones para poner '-' o '-'. Frente a los argumentos opcionales y hay que permitir que todos los argumentos para estar en cualquier orden

Así que aquí hay un ejemplo usando optparse:

import sys, re, optparse

first_re = re.compile(r'^\d{3}$')

parser = optparse.OptionParser()
parser.set_defaults(debug=False,xls=False)
parser.add_option('--debug', action='store_true', dest='debug')
parser.add_option('--xls', action='store_true', dest='xls')
(options, args) = parser.parse_args()

if len(args) == 1:
    if first_re.match(args[0]):
        print "Primary argument is : ", args[0]
    else:
        raise ValueError("First argument should be ...")
elif len(args) > 1:
    raise ValueError("Too many command line arguments")

if options.debug:
    print 'debug flag'

if options.xls:
    print 'xls flag'

Las diferencias aquí con optparse y su especificación es que ahora se puede tener líneas de comando como:

python script.py --debug --xls 001

y se puede añadir fácilmente nuevas opciones llamando parser.add_option ()

Otros consejos

Tener un vistazo a la optparse módulo. Tratar con sys.argv mismo está muy bien para cosas realmente simple, pero va de las manos rápidamente.

Tenga en cuenta que es posible que optparse más fácil de usar si se puede cambiar el formato del argumento un poco; p.ej. reemplazar debug con --debug y xls con --xls o --output=xls.

optparse es su mejor amigo para analizar la línea de comandos. También busque en argparse ; no está en la biblioteca estándar, sin embargo.

Si desea implementar modificadores de línea de comandos reales, dan getopt un vistazo. Es increíblemente fácil de usar, también.

Van Gale es en gran medida correcta en el uso de la expresión regular en contra del argumento. Sin embargo, no es absolutamente necesario para que todo sea una opción cuando se utiliza optparse, que se divide en sys.argv opciones y argumentos, en función de si el signo "-" o "-" está en frente o no. Un código de ejemplo para ir a través de solamente los argumentos:

import sys
import optparse

claParser = optparse.OptionParser()
claParser.add_option(
(opts, args) = claParser.parse_args()
if (len(args) >= 1):
  print "Arguments:"
  for arg in args:
    print "  " + arg
else:
  print "No arguments"
sys.exit(0)

Sí, la matriz args se analiza de la misma manera como sys.argv sería, pero la capacidad de agregar fácilmente las opciones si es necesario se ha añadido. Para más información sobre optparse, echa un vistazo a la relevante doc Python .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top