2013-07-16 37 views
0

全部,Python - 需要在命令行獲得參數

我有一個個人腳本,我正在嘗試編寫,並且遇到了一個小問題。問題是,無論論點在哪裏,我都希望能夠支持'-s'的論點。我也希望這個論點不止一次被允許。例如:

script.py firstargument secondargument -s thirdargument -s第四第五第六-s

我已經試過是行不通的。我已經試過如下:

currentArg = 1 
foldername = sys.argv[1:] 
for folders in foldername: 
    if "-s" in folders: 
    newArg = currentArg + 1 
    setType = str(sys.argv[newArg]) 
    function(setType) 

它在做什麼是它的服用-s作爲參數,並仍通過對函數。什麼我喜歡它上面是看到第一「-S」是在第四位置時,添加1至4,然後的setType設爲sys.argv中[5]。我還希望它繼續遍歷參數並找到任何'-s',然後使用下一個參數作爲值。有任何想法嗎?

,我得到的錯誤是:

WindowsError: [Error 3] The system cannot find the path specified: 'c:\\-s/*.*' 

聲明,它認爲-s作爲參數,並試圖通過,作爲一個文件夾,但我希望它傳遞一個參數作爲文件夾.. 。

是否有這樣做的更好的辦法?我需要採取一切「-s」考慮......

+4

你應該看看argparse HTTP:// docs.python.org/2/howto/argparse.html – monkut

+4

你有沒有使用Python附帶的'argparse'模塊?爲什麼要養一隻狗,然後吠叫自己? –

+0

Argparse似乎不允許我在沒有 - 符號的情況下傳遞選項。換句話說,當我通過以下命令時出現錯誤:

1

argparse是美麗的。重新設計您的命令行界面或編寫您自己的CLI解析器。 CLI例如:

args = ['firstargument', 'secondargument', '-s', 'thirdargument', '-s', 'fourth', 'fifth', '-s', 'sixth'] 
last_arg = None 
container = [] 
marker = '-s' 
for arg in args: 
    if (arg != marker): last_arg = arg 
    else: container.append(last_arg) 
print container   

執行的結果:

$python test.py 
['secondargument', 'thirdargument', 'fifth'] 
+0

我一直在看你的代碼。它看起來不像你得到的輸出是我正在尋找的。你的輸出缺少第一個參數。它應該看到第一個參數,因爲之前沒有列出「-s」,對嗎?我也嘗試過今天玩argparse,並且根本無法在不使用「-s」的情況下使用它。如果我指定-s,它會起作用,但如果沒有它,它會說這是一個未知選項。 – Nutrion

+0

其他解決方案見下面http://stackoverflow.com/a/17692588/2404181 –

0

東西入手:

import sys 
import getopt 

def some_function(*args): 
    print "Got", args 
    return None 

funct_dict = \ 
{ 
    "-s" : some_function, 
    "--skip" : some_function 
} 
safety_dance = lambda *x: None 

try: 
    optlist, args = getopt.getopt(sys.argv[1:], "s:", ["--skip="]) 
except getopt.GetoptError: 
    print "Das ist verboten" 
    sys.exit() 

for (key, option) in optlist: 
    funct_dict.get(key, safety_dance)(option) 
0

我一直在使用http://docopt.org/非常滿意。

https://github.com/docopt/docopt

它爲您完成所有的猴子的工作,你只是從寫文檔,它讓你的命令行參數結構...

額外的好處:你的用戶獲得免費的幫助: - )

針對您的特殊情況下,它會但是,(強烈:-))鼓勵你使用特定的標準慣例,你可能會或可能不喜歡。你比如有定位和命名參數和docopt的選擇將它們放在一起給你,但命名參數通常有以下形式:

--speed=20 
-fmyfile.txt 
+0

我幾天前嘗試過docopt。這確實是一個偉大的圖書館;) – astrognocci

0

我使用專用庫,用於解析參數時的第二個建議它們比字符串列表要複雜得多。 Docopt非常棒,或者如果您不想安裝第三方庫,請參閱argparse。

但是,如果你想自己動手,嘗試類似的規定:

args = sys.argv[1:] 
if '-s' in args: 
    i = args.index('-s') 
    opt_val = args.pop(i+1) 
    args.remove('-s') 
folders = [] 
for folder in args: 
    folders.append(folder)