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 convert.py -i video_*
{'input_filename': 'video_1.wmv'}

当前文件夹中有 video_[1-6].wmv。问题是为什么video_*变成video_1.wmv。我做错了什么?

4

4 回答 4

8

Python 与此无关——它是 shell。

称呼

$ python convert.py -i 'video_*'

它会传入那个通配符。

其他六个值作为 args 传入,没有附加到-i,就像您运行 一样python convert.py -i video_1 video_2 video_3 video_4 video_5 video_6,并且-i唯一附加到紧接的下一个参数。

也就是说,您最好的选择可能是从 读取您的输入文件名args,而不是使用options.input.

于 2008-11-23T16:20:25.100 回答
2

打印出 args,你会看到其他文件的去向......

它们被转换为 argv 中的单独参数,并且 optparse 仅将第一个参数作为 input_filename 选项的值。

于 2008-11-23T16:20:51.290 回答
1

澄清:

aprogram -e *.wmv

在 Linux shell 上,所有通配符 (*.wmv) 都由 shell 扩展。所以aprogram实际上收到了论点:

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

就像查尔斯说的那样,你可以引用这个论点让它从字面上传递:

aprogram -e "*.wmv"

这将传入:

sys.argv == ['aprogram', '-e', '*.wmv']
于 2008-11-23T20:22:25.640 回答
0

这并不明显,即使您阅读了一些标准(如thisthis)。

命令行的args部分——几乎普遍——是输入文件。

只有非常罕见的奇数情况下,输入文件被指定为选项。它确实会发生,但非常罕见。

此外,输出文件永远不会被命名为args。它们几乎总是作为命名选项提供。

这个想法是

  1. 大多数程序可以(并且应该)从标准输入读取。的命令行参数-是“stdin”的代码。如果没有给出参数,stdin 是后备计划。

  2. 如果您的程序打开任何文件,它也可以打开命令行中指定的无限数量的文件。Shell 通过为您扩展通配符来促进这一点。[但是,Windows 不会为您执行此操作。]

  3. 您的程序不应该在没有明确的命令行选项的情况下覆盖文件,例如“-o somefile”来写入文件。

请注意,cpmvrm是不遵循这些标准的程序的重要示例。

于 2008-11-23T18:54:25.287 回答