2013-09-25 26 views
5

Questo è il mio scriptpitone argomenti della riga di comando in principale, saltare nome dello script

def main(argv): 
if len(sys.argv)>1: 
    for x in sys.argv: 
     build(x) 

if __name__ == "__main__": 
    main(sys.argv) 

in modo da linea di comando che scrivo python myscript.py commandlineargument

lo voglio per saltare myscript.py e semplicemente gestito commandlineargument attraverso commandlineargument(n)

quindi capisco che il mio ciclo for non tiene conto di questo, ma come faccio a farlo?

+1

Se la funzione 'main' accetta un parametro' argv', probabilmente dovrebbe _use_ quel parametro, piuttosto che ignorarlo e usare 'sys.argv' invece ... – abarnert

+0

Inoltre, non è necessario il controllo' if' su tutti. Se non ci sono argomenti, il ciclo verrà eseguito correttamente 0 volte, quindi lascialo fare. – abarnert

+0

@abarnert Ho un altro – CQM

risposta

14

Dal sys.argv è un elenco, è possibile utilizzare affettare sys.argv[1:]:

def main(argv): 
    for x in argv[1:]: 
     build(x) 

if __name__ == "__main__": 
    main(sys.argv) 

Ma, se si può avere un solo parametro di script, basta farlo per indice: sys.argv[1]. Ma, si dovrebbe verificare se la lunghezza del sys.argv è superiore a 1 e genera un errore se non lo fa, per esempio:

def main(argv): 
    if len(argv) == 1: 
     print "Not enough arguments" 
     return 
    else: 
     build(argv[1]) 

if __name__ == "__main__": 
    main(sys.argv) 
2

La vera risposta è quella di conoscere e utilizzare argparse, però.

+0

L'ho usato prima, qual è il vantaggio tra esso e sys.argv o l'uso di optparse rispetto a qualcos'altro – CQM

+0

È la cosa da usare per arg analizzare (a meno che non sia necessario 'cliff'). Ha un'ottima API. Non è deprecato come 'optparse'. Standardizza il look + feel del tuo copione. – jhermann