2011-12-07 11 views
5

Al momento ho uno script che utilizza il file globbing tramite la variabile sys.argv in questo modo:Utilizzando argparse in combinazione con sys.argv in Python

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

Questa grande opera per l'elaborazione di un gruppo di file; tuttavia, vorrei usare questo anche con il modulo argparse. Quindi, vorrei il mio programma per essere in grado di gestire qualcosa come il seguente:

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

Qualcuno ha provato a fare questo, o hanno alcune indicazioni su come procedere?

+1

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

+1

Si dovrebbe sbarazzarsi del file 'len (sys.argv)' e lascia che 'argparse' interagisca con' sys.argv', la funzionalità è lì dentro. – wim

risposta

15

Se ti ho preso correttamente, la tua domanda riguarda il passaggio di un elenco di file insieme a qualche contrassegno o parametri facoltativi al comando. Se ho avuto ragione, poi basta necessario sfruttare le impostazioni argomento argparse:

File 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 linea commentato sopra informare il parser di aspettarsi un numero indefinito> = 0 (nargs ='*') di argomenti posizionali.

esecuzione dello script dalla riga di comando dà queste uscite:

$ ./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 
[] 

osservare come i file saranno in una lista a prescindere dal loro essere diversi o solo uno.

HTH!

+0

Esattamente quello che stavo cercando! Grazie! – mevatron

+0

Come faresti la stessa cosa se non per una bandiera? Ho parser.add_argument ('- b', '--blacklist', nargs = '*' 'e mi piacerebbe passare * .mp3 nel programma dalla shell.Inoltre, la lista nera è usata in' os. walk', quindi i file mp3 attuali non saranno nella directory di lavoro – p014k

+0

@ p014k - Non sono sicuro di aver ricevuto la tua domanda. Vuoi passare una lista di file usando il carattere jolly dell'asterisco ['*'] ma senza lasciando che la shell faccia l'espansione per te? Se questo è il caso, devi citare l'argomento: './p.py --doh '* .py''. Dall'interno dello script' p.py' dovrai usa ['fnmatch'] (https://docs.python.org/2/library/fnmatch.html) per fare l'espansione per te o ti ho frainteso? – mac

1

In alternativa si può utilizzare sia nel seguente modo:

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) 

Tuttavia questo funziona solo per i parametri indipendenti, altrimenti i valori degli argomenti sarebbero trattati come argomenti di file (a meno che non li separeranno con lo spazio o migliorerai ulteriormente il codice).