2011-12-07 21 views
5

que actualmente tiene un guión, que utiliza el archivo de comodines mediante la variable sys.argv así:argparse conjuntamente con sys.argv en Python

if len(sys.argv) > 1: 
     for filename in sys.argv[1:]: 

Esto funciona muy bien para el procesamiento de un montón de archivos; sin embargo, me gustaría utilizar esto con el módulo argparse también. Por lo tanto, me gustaría que mi programa sea capaz de manejar algo como lo siguiente:

[email protected]:~$ myScript.py --filter=xyz *.avi 

alguien ha tratado de hacer esto, o tiene algunos consejos sobre cómo proceder?

+1

[parseo parcial con argparse?] (Http://docs.python.org/dev/library/argparse.html#partial-parsing) – ig0774

+1

Deberías deshacerte de las cosas 'len (sys.argv)' y simplemente deja que 'argparse' interactúe con' sys.argv', la funcionalidad está allí. – wim

Respuesta

15

Si te contesté correctamente, tu pregunta es acerca de pasar una lista de archivos junto con algunos indicadores o parámetros opcionales al comando. Si te tengo derecho, a continuación, sólo tiene que aprovechar la configuración de argumentos en argparse:

Archivo p.py

import argparse 

parser = argparse.ArgumentParser(description='SO test.') 
parser.add_argument('--doh', action='store_true') 
parser.add_argument('files', nargs='*') # This is it!! 
args = parser.parse_args() 
print(args.doh) 
print(args.files) 

La línea comentada anteriormente informar al analizador esperar un número no definido> = 0 (nargs ='*') de argumentos posicionales.

Ejecutar el script desde la línea de comandos da estas salidas:

$ ./p.py --doh *.py 
True 
['p2.py', 'p.py'] 
$ ./p.py *.py 
False 
['p2.py', 'p.py'] 
$ ./p.py p.py 
False 
['p.py'] 
$ ./p.py  
False 
[] 

observar cómo los archivos estarán en una lista independientemente de ellos varios o uno solo.

HTH!

+0

¡Exactamente lo que estaba buscando! ¡Gracias! – mevatron

+0

¿Cómo harías lo mismo si no fuera por una bandera? Tengo 'parser.add_argument ('- b', '--blacklist', nargs = '*'' y me gustaría pasar * .mp3 al programa desde el shell. Además, la lista negra se usa en 'os. walk', por lo que los archivos mp3 reales no estarán en el directorio de trabajo. – p014k

+0

@ p014k - No estoy seguro de haber recibido su pregunta. ¿Desea pasar una lista de archivos usando el comodín asterisco ['*'] pero sin dejando que el caparazón haga la expansión por ti? Si ese es el caso, debes citar el argumento: './p.py --doh '* .py''. Desde dentro del script' p.py' tendrás que use ['fnmatch'] (https://docs.python.org/2/library/fnmatch.html) para hacer la expansión por usted. ¿O lo malentendí? – mac

1

Alternativamente, usted puede usar tanto de la siguiente manera:

import sys 
import argparse 
if __name__ == '__main__': 
    parser = argparse.ArgumentParser() 
    parser.add_argument("-v", "--verbose", help="increase verbosity", action="store_true") 
    args, unknown = parser.parse_known_args() 
    for file in sys.argv: 
     if not file.startswith("-"): 
      print(file) 

Sin embargo, esto sólo funcionará para los parámetros independientes, de lo contrario los valores de los argumentos serían tratados como argumentos de archivo (a menos que no les va a separar con el espacio o mejorarás el código aún más).

Cuestiones relacionadas