2008-11-23 56 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']