2012-02-25 14 views
9
from sys import argv 
script, lira_cbt, [eur_hedge] = argv 

if eur_hedge == None: 
    #Do x 
else: 
    #Do y 

Voglio che sia in grado di eseguire con solo lira_cbt come argomento (facendo x), o con sia lira_cbt che eur_hedge (facendo y). Questo può essere ottenuto con sys.argv?Può sys.argv gestire gli argomenti facoltativi?

+1

Se il CLI ottiene quel complesso, probabilmente si dovrebbe iniziare a utilizzare 'argparse' (o' optparse' se sei bloccato con qualche versione precedente). – delnan

risposta

15

basta usare la lunghezza del sys.argv

if len(sys.argv) == 2: 
    # do X 
else: 
    # do Y 
2

È sufficiente verificare la lunghezza di sys.argv.

if len(sys.argv) < 2: 
    # Error, not enough arguments 

lira_cbt = sys.argv[1] 
if len(sys.argv) == 2: 
    # Do X 
else: 
    eur_hedge = sys.argv[2] 
    # Do Y 
+0

Ma non c'è modo di tirare il valore in eur_hedge in modo specifico senza dover aggiungere più/troppe variabili per scompattare l'argomento? – Felix

+2

No, non c'è modo di farlo, a meno che tu non voglia convertirlo in una chiamata di funzione e usare qualcosa come 'def main (script, lira_cbt, eur_hedge = None)' e 'main (* sys.argv)', che Io sicuramente non lo farei. –

1

Un'altra opzione è quella di estrarre i valori della lista argv utilizzando try:

lira_cbt = sys.argv[1] 
try: 
    eur_hedge = sys.argv[2] 
except IndexError: 
    eur_hedge = None 

if eur_hedge == None: 
    # Do X 
else: 
    # Do Y 

Si potrebbe anche dare un'occhiata a getopt per un parser più flessibile degli argomenti della riga di comando.

+2

optparse o argparse sarebbero molto meglio di getopt! – carl

5

Se questo è di far parte di più di uno script e getta, è consigliabile utilizzare argparse http://docs.python.org/library/argparse.html

Al momento sarà molto più complicato, ma vi aiuterà a mantenere documentato le opzioni del programma accetta e forniscono anche utili messaggi di errore a differenza di uno "troppi valori da decomprimere" che l'utente potrebbe non capire.

0

Se posso suggerire un approccio alternativo:

from sys import argv 
option_handle_list = ['--script', '--lira_cbt', '--eur_hedge'] 
options = {} 
for option_handle in option_handle_list: 
    options[option_handle[2:]] = argv[argv.index(option_handle) + 1] if option_handle in argv else None 
if options['eur_hedge'] == None: 
    #Do x 
else: 
    #Do y 
+0

Anche se questo potrebbe funzionare, l'uso di un modulo come 'argparse' per questo compito sarebbe sia più facile che più pirolitico. – YSelf

+0

@ Io stesso non sto discutendo sulla soluzione più semplice/tradizionale. Sto solo rispondendo alla domanda originale. –

Problemi correlati