2011-12-12 57 views
1

在python應用程序的框架內,我需要調用幾個主要使用optparse的腳本。他們都有這種形式的切入點:python:在給定列表上使用optparse而不是系統命令行參數

if __name__ == '__main__': 
    mains(sys.argv) 

我剛剛打電話給我的主要功能mains想法,我的問題最初都來自那裏。然後,mains開始總是這樣的,作爲一個例子:

def mains(argv): 
    parser = OptionParser() 
    parser.add_option("-f", "--file", dest="filename", help="write result to FILE", metavar="FILE") 
    parser.add_option("-x", "--filter", dest="filterset", help="filters", metavar="FILTERS") 
    parser.add_option("-n", "--nameonly", dest="nameonly", help="nameonly", metavar="NAME_ONLY") 
    parser.add_option("-z", "--ignorezeros", dest="ignorezeros", help="ignorezeros", metavar="IGNORE_ZEROS") 
    parser.add_option("-y", "--xfilter", dest="xfilter", help="xfilter", metavar="X_FILTERS") 

這裏的argv不使用optparser,我沒有找到如何將它傳遞給它。從我的實際主要腳本中,我想我可以通過將參數作爲列表傳遞來調用這些mains。 Obvioulsy,在當前狀態下,子腳本總是會選擇命令行......如何自己傳遞參數?

UPDATE:我的腳本試圖做出subcripts這些電話被稱爲這種方式從控制檯:

start.py -df 

問題:從第一個下標optparse告訴我,「d」是不是有效選項,這表明它正在選擇控制檯參數。

回答

3

你忽略了通話解析你的選擇叫它:

parser.parse_args(argv) 

parse_args接受一個可選參數,它將用於解析,而不是s ys.argv。

1

你傳遞的參數列表作爲一個參數,你必須定義mains

def mains(*args): 
    ... 

代替,並通過

mains(*sys.argv) 
+0

但我不想sys.argv,我想我的列表被視爲參數,即不同的下標調用列表 – Jerome

+1

我想大衛的答案是正確的。 –

1

這是http://docs.python.org/library/optparse.html

答案(如果你願意,你可以通過自定義的參數列表parse_args(),但這是很少需要:在默認情況下它使用sys.argv[1:]。)

代替的:

(options, args) = parser.parse_args() 

做:

(options, args) = parser.parse_args(argv) 

可能砍掉的第一個項目,如果它是程序名

2

雖然其他人已經回答了你的眼前問題,我會強烈建議您把所有的說法,分析的東西,在你的腳本if __name__ == "__main__"部分,而比在main()功能。你的main()函數應該更像一個普通的Python函數。這樣,如果你需要從另一個模塊調用它,你不必假裝argv並假裝你從命令行調用它。