2008-11-23 30 views
3
if __name__=='__main__': 
    parser = OptionParser() 
    parser.add_option("-i", "--input_file", 
        dest="input_filename", 
         help="Read input from FILE", metavar="FILE") 

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

結果是Python中,optparse和文件掩碼

$ python convert.py -i video_* 
{'input_filename': 'video_1.wmv'} 

有視頻_在當前文件夾[1-6]的.wmv。 問題是,爲什麼視頻_ *成爲video_1.wmv。我做錯了什麼?

回答

8

Python有沒有關係這一點 - 它的外殼。

呼叫

$ python convert.py -i 'video_*' 

,它會傳遞通配符。

其他六個值作爲參數傳入,沒有附加到-i,就好像您運行的是python convert.py -i video_1 video_2 video_3 video_4 video_5 video_6-i僅附加到下一個參數。

也就是說,您最好的選擇可能是從args中讀取您的輸入文件名,而不是使用options.input

2

打印出來ARGS,你會看到那裏的其他文件會...

他們被轉換爲argv中分隔參數,並且optparse只需要第一個作爲input_filename選項的值。

0

這不是明擺着的,即使你讀一些標準(如thisthis)。

參數命令行的一部分是 - 幾乎普遍 - 輸入文件。

只有其中輸入文件被指定爲選項非常罕見的奇數球的情況下。它確實發生了,但它非常罕見。

此外,輸出文件永遠不會命名爲ARGS。它們幾乎總是作爲命名選項提供。

的想法是,可以從標準輸入讀取

  1. 大多數程序(也應該)。 -的命令行參數是「stdin」的代碼。如果沒有提供參數,則stdin是後備計劃。

  2. 如果你的程序打開任何文件,它可能也打開命令行上指定的文件的數量不受限制。外殼通過爲你擴展通配符來促進這一點。但是,Windows不會爲你做這件事。]

  3. 你的程序不應該在沒有明確的命令行選項的情況下覆蓋文件,如'-o somefile'寫入文件。

注意cpmvrm是不遵循這些標準程序在大的例子。

+0

雖然您的評論是信息豐富的,它不會遠程回答所問的問題。 – 2008-11-24 19:58:30

1

澄清:

aprogram -e *.wmv 

在Linux外殼,所有的通配符(* .WMV)被shell擴展。所以aprogram居然臨危參數:

sys.argv == ['aprogram', '-e', '1.wmv', '2.wmv', '3.wmv'] 

Charles說,你可以引述的說法得到它在字面上傳遞:

aprogram -e "*.wmv" 

這將傳遞:

sys.argv == ['aprogram', '-e', '*.wmv']