2012-08-31 24 views
5

Actualmente tengo un archivo python que utiliza sys.argv [1] para aceptar una cadena en la línea de comandos. Luego realiza operaciones en esa cadena y luego regresa la cadena modificada a la línea de comando.La forma más pitónica de aceptar argumentos usando optparse

me gustaría poner en práctica una opción de modo discontinuo en el que puedo proporcionar un archivo de cuerdas (uno por línea, fwiw) y tienen que volver a la línea de comandos para que pueda redirigir la salida haciendo algo como

$ python script.py -someflag file.txt > modified.txt 

manteniendo las capacidades actuales.

Solo estoy ejecutando 2.6, por lo que argparse no es una opción. Los tutoriales que he visto utilizan argparse, getopt o profundizar en ejemplos que son demasiado complejos/no se aplican.

¿Cuál es la mejor manera de verificar la entrada y actuar de forma adecuada?

+1

argparse sigue siendo una opción , simplemente no está integrado en 2.6. Todavía puede instalarlo como cualquier paquete de terceros (por ejemplo, 'pip install argparse'). –

Respuesta

6

argparse sigue siendo una opción, simplemente no está integrado en 2.6. Todavía puede instalarlo como cualquier paquete de terceros (por ejemplo, usando easy_install argparse).

Un ejemplo de código para esto sería:

import sys 
import argparse 

p = argparse.ArgumentParser(description="script.py") 
p.add_argument("-s", dest="string") 
p.add_argument("-f", dest="infile") 

args = p.parse_args() 

if args.infile == None and args.string == None: 
    print "Must be given either a string or a file" 
    sys.exit(1) 
if args.infile != None and args.string != None: 
    print "Must be given either a string or a file, not both" 
    sys.exit(1) 
if args.infile: 
    # process the input file one string at a time 
if args.string: 
    # process the single string 
+0

¡Gracias! No sabía que argparse era un tercero antes de 2.7, y el código es una ventaja añadida. Probablemente acepte esto tan pronto como tenga la oportunidad de probarlo :) – verbsintransit

+0

Eres bienvenido. argparse es una herramienta muy poderosa e intuitiva y lo recomiendo encarecidamente. –

+1

Cuando se prueba contra 'Ninguno', es más pitónico utilizar' is' y 'is not' para probar ese valor:' if args.infile es None y args.string es None: 'y' if args.infile es not None y args.string no es None: '. –

3

Ver mi respuesta aquí: What's the best way to grab/parse command line arguments passed to a Python script?

Como método abreviado, aquí algunos ejemplos de código:

import optparse 

parser = optparse.OptionParser() 

parser.add_option('-q', '--query', 
    action="store", dest="query", 
    help="query string", default="spam") 

options, args = parser.parse_args() 

print 'Query string:', options.query 
+0

** Nota **: no se recomienda utilizar * optparse * desde Python versión 2.7. El módulo optparse está en desuso y no se desarrollará más; el desarrollo continuará con el módulo * argparse *. Ver [PEP 0389] (http://www.python.org/dev/peps/pep-0389/) para más información. – shakaran

Cuestiones relacionadas