2012-12-11 27 views
2

有沒有辦法讓以下工作? 我在找什麼,是基於另一個選項的價值。Python optparse,有一個選項取決於另一個

import optparse 
parser = optparse.OptionParser() 

parser.add_option("--file-name", default="/foo/bar", dest="file_name") 

parser.add_option("--file-action", 
    default="cp %s /bar/baz" % (options.file_name), 
    dest="fileaction") 

options, args = parser.parse_args() 

很明顯,因爲它是在它不會工作的那一刻,因爲

局部變量「選項」分配

+1

'optparse'模塊自Python 2.7以來已被棄用。您可以考慮使用'argparse'代替Python 2.x:'pip install argparse' –

+0

感謝您的評論,但是,改變當前代碼庫不在列表中;-) –

+1

我不認爲你已經想到了這一點,首先,文件操作不應該包含文件名,否則沒有理由將文件名包含爲參數在第一位。另外,如果你打算讓一個腳本接收一個文件名爲file-action,然後對這個文件執行這個動作,爲什麼不簡單地有3個參數「file-name」「file-command」「file-arguments 「然後簡單地把它們放在一起,只要你想要? –

回答

1

只是他們兩個:

parser.add_option("--file-name", dest="file_name") 
parser.add_option("--file-action", dest="file_action") 

你可以用簡單的邏輯。

if options.file_name: 
    #do code relating to file_action 

甚至

if options.file_action and not options.file_name: 
    raise ValueError("No Filename specified") 
# do your code here. 
+2

他有他們倆... –

0

您稍後按摩默認之前所引用。如果該選項是默認的,然後做按摩:

parser.add_option("--file-action", 
    default="cp <filename> /bar/baz", 
    dest="fileaction") 

options, args = parser.parse_args() 

if options.fileaction == "cp <filename> /bar/baz": 
    options.fileaction = "cp %s /bar/baz" % (options.file_name) 

也就是說,在這個例子中,fileaction和文件名看起來衝突,所以它是沒有意義的,同時設置兩個,他們將覆蓋彼此的方式不明顯。我會讓fileaction默認爲"cp",併爲'/bar/baz'添加--action-target,然後從這些部分構建調用。

+0

該解決方案的唯一問題是'__default__'值會出現在幫助中,使其有點難看。 –

+0

@DawidFatyga:的確如此。其實,想一想,你甚至不需要標記。只要它解決了默認,它就可以工作。我相應地更新了答案。 –

+0

好的 - 當有文件操作時會發生什麼,它將如何設置爲包含文件名? - 另外,從什麼時候可以傳遞一個參數到optparse,並用空格分隔相同參數的單詞? –

0

您的解析器的處理程序。它將解釋python在程序啓動時接收到的命令行會做什麼。因此,在你的選擇中有一個依賴是不正確的。

我建議你,是處理你的代碼的默認行爲。你可以這樣做:

parser.add_option("--file-action", 
default=None, 
dest="fileaction") 

options, args = parser.parse_args() 

# Manage the default behaviour 
if not options.fileaction: 
    fileaction = "cp %s /bar/baz" % (options.file_name) 
    # You could then use fileaction the way you would use options.fileaction 
相關問題