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

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

我希望它能夠以lira_cbt作爲參數(做x)或者同時使用lira_cbt和eur_hedge(做y)來運行。這可以通過sys.argv來實現嗎?sys.argv可以處理可選參數嗎?

+1

如果CLI獲取複雜的,(如果你堅持一些舊版本或'optparse')你或許應該開始使用'argparse'。 – delnan 2012-02-25 10:01:13

回答

15

只需使用的sys.argv

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

您可以簡單地檢查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

但沒有辦法專門拉eur_hedge中的值,而不會拋出一個需要更多/太多變量來解壓縮參數? – Felix 2012-02-25 07:58:54

+2

不,沒有辦法做到這一點,除非你想將它轉換爲函數調用並使用類似'def main(script,lira_cbt,eur_hedge = None)'和'main(* sys.argv)'這樣的東西我絕對不會這樣做。 – 2012-02-25 08:00:57

1

另一種選擇是使用try來提取argv列表中的值長度:

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 

你也可以看看getopt爲一個更靈活的命令行參數解析器。

+2

optparse或argparse會比getopt好得多! – carl 2012-02-25 08:46:53

5

如果這是要的不是扔掉的腳本的詳細部分,可以考慮使用argparse http://docs.python.org/library/argparse.html

目前,它會更加複雜,但它會幫助你保持記錄的程序接受的選項和也提供有用的錯誤消息,而不像 「解包太多值」,用戶可能不理解。

0

如果我可以建議另一種方法:

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

雖然這可能會奏效,但使用像'argparse'這樣的模塊來完成這個任務將會更容易,更麻煩。 – YSelf 2017-12-15 23:39:10

+0

@YSelf我不是在討論更簡單/更傳統的解決方案。只是回答原來的問題。 – 2017-12-16 19:07:22