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

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

Chcę, aby był w stanie uruchomić z just lira_cbt jako argument (robi x) lub z lira_cbt i eur_hedge (robi y). Czy można to osiągnąć za pomocą sys.argv?Czy sys.argv może obsługiwać opcjonalne argumenty?

+1

Jeśli CLI dostaje że kompleks, powinieneś zacząć używać 'argparse' (lub' optparse' jeśli utkniesz z jakiejś starszej wersji). – delnan

Odpowiedz

15

Wystarczy użyć długość sys.argv

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

Możesz po prostu sprawdzić długość 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

Ale nie ma sposobu, aby konkretnie wyciągnąć wartość w eur_head bez konieczności wymuszania więcej/zbyt wiele zmiennych, aby rozpakować argument? – Felix

+2

Nie, nie ma sposobu, aby to zrobić, chyba że chcesz przekonwertować go na wywołanie funkcji i użyć czegoś takiego jak 'def main (script, lira_cbt, eur_hedge = None)' i 'main (* sys.argv)', które Na pewno bym tego nie zrobił. –

1

Inną opcją jest, aby wyodrębnić wartości z listy argv użyciu 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 

Można również spojrzeć na getopt dla bardziej elastyczny analizator składni argumentów linii poleceń.

+2

optparse lub argparse byłyby znacznie lepsze niż getopt! – carl

5

Jeśli to ma być częścią bardziej niż skryptu jednorazowe, należy rozważyć użycie argparse http://docs.python.org/library/argparse.html

W tej chwili to będzie dużo bardziej skomplikowane, ale to pomoże Ci zachować udokumentowane opcje program akceptuje i dostarczają również użytecznych komunikatów o błędach, w przeciwieństwie do "zbyt wielu wartości do rozpakowania", których użytkownik może nie rozumieć.

0

Jeśli mogę zasugerować alternatywne podejście:

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

Chociaż może to zadziałać, użycie takiego modułu jak "argparse" do tego zadania będzie łatwiejsze i bardziej pythonic. – YSelf

+0

@YSelf Nie debatuję nad łatwiejszym/bardziej tradycyjnym rozwiązaniem. Po prostu odpowiadając na oryginalne pytanie. –

Powiązane problemy