2010-10-28 39 views
2

我希望能够传递参数而不必指定optparse选项。如果我确实通过了一个选项,它必须是已知的选项,否则脚本将失败。如果给出值,则忽略optparse

Rsync的下列文件到目的地

myscript.py filename 

Rsync的以下文件夹到目的地(这一切都是想通了函数创建)。

myscript.py -f foldername 

原因是,我有一个数组(或字典)与“文件夹名称”绑定。如果没有选项通过,CLI中给出的参数是用户调用脚本的工作文件夹中的文件。通过-f表示上传一个文件夹,其值存储在一个字典中(用户可以在任何目录下,该文件夹的路径是提前知道的)。

我最好为这两个选项添加选项吗? -f为文件和-v为文件夹又名版本?

+0

你大概可以按照另一种方法是,检查参数,然后进行相应的处理。例如,如果os.path.isdir(argument)://处理目录。如果os.path.isfile(参数):处理文件。也许这个? – user225312 2010-10-28 19:05:52

回答

0

我一直都很明确,但是你可以短路optparse。

# args[0] is always the executable's name 
if len(args) > 1: 
    parser.parse_args(args, options) 
else: 
    #open file 
+0

如果args = sys.argv,请记住len(args)总是> = 1.这是因为argv [0]是脚本的名称。 – 2010-10-28 19:34:48

+0

'> 2'不起作用。 ''1'作品 – luckytaxi 2010-10-28 19:40:09

+0

哈,谢谢,我起初有这个,但出于某种原因改变了它。 – NorthIsUp 2010-10-28 20:27:05

0

款待-f作为不带参数的选项,并用它来切换位置参数的行为(即foldername)。

0

parser.parse_args()总是返回两个值:解析选项之后剩余

  • 选项,包含所有选项
  • ARGS,位置参数列表中值的对象

Totorial

因此,你可以做这样的事情:

parser = OptionParser() 
parser.add_option("-f", "", action="store_true", dest="folder", default=False) 
(options, args) = parser.parse_args(sys.argv) 

fname = args[1] # name of folder or file 

if options.folder: 
    # do stuff for folder 
else: 
    # do stuff for file