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的原因。我做错了什么?
答案 0 :(得分: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
。
答案 1 :(得分:2)
打印args,你会看到其他文件的去向......
它们在argv中被转换为单独的参数,而optparse只将第一个参数作为input_filename选项的值。
答案 2 :(得分:1)
澄清:
aprogram -e *.wmv
在Linux shell上,所有通配符(* .wmv)都由shell扩展。所以aprogram
实际上收到了论据:
sys.argv == ['aprogram', '-e', '1.wmv', '2.wmv', '3.wmv']
就像Charles所说的那样,你可以引用这个论点来让它按字面意思传递:
aprogram -e "*.wmv"
这将传入:
sys.argv == ['aprogram', '-e', '*.wmv']
答案 3 :(得分:0)
即使您阅读了一些标准(例如this或this),也不是很明显。
命令行的 args 部分 - 几乎普遍 - 是输入文件。
只有非常罕见的奇数球情况,其中输入文件被指定为选项。确实发生了,但这种情况非常罕见。
此外,输出文件永远不会命名为 args 。它们几乎总是作为命名选项提供。
想法是
大多数程序都可以(并且应该)从stdin中读取。 -
的命令行参数是“stdin”的代码。如果没有给出参数,则stdin是后备计划。
如果您的程序打开任何文件,它也可以在命令行上打开无限数量的文件。 shell通过扩展通配卡来促进这一点。 [但是,Windows不会为您执行此操作。]
如果没有明确的命令行选项(例如'-o somefile')来写入文件,程序就不应该覆盖文件。
请注意,cp
,mv
,rm
是不遵循这些标准的程序的重要示例。