确定要使用的选项执行的功能

时间:2011-03-23 00:42:20

标签: python function scripting options

选项/参数如何确定在程序执行期间选择哪个函数?对于示例,我有两个选项,具体取决于我希望他们使用各自功能的选项。我错过了什么?

import os, sys, glob
from optparse import OptionParser

def fname(arguments):
    files = []
    for arg in arguments:
        if '*' in arg or '?' in arg:
            # contains a wildcard character
            files.extend(glob.glob(arg))
        elif os.path.isdir(arg):
            # is a dictionary
            files.extend(glob.glob(os.path.join(arg, '*')))
        elif os.path.exists(arg):
            # is a file
            files.append(arg)
        else:
            # invalid?
            print '%s invalid' % arg
    return files

# check if file exists locally, if not: download it
def downnload(filename, keyString):
    if not os.path.exists(filename+keyString):
        l.get_contents_to_filename(filename+keyString)

# List bucket contents
def blist(bucket):
    for b in rs:
        print b.name

def main():
    usage = "usage: %prog [options] -f filename"
    parser = OptionParser(usage)
    parser.add_option('-d', '--download',
            action='store', dest='download',
            default=None, help='download files from cloud')
    parser.add_option('-l', '--list',
            action='store', dest='bucket',
            default=None, help='list buckets or contents of specified bucket')

    if len(sys.argv) == 1:
        parser.print_help()
        sys.exit()
    (options, args) = parser.parse_args()

    # from boto import
    bucket_list = bucket.list()
    for l in bucket_list:
        keyString = str(l.key)

    downnload(options.filename, keyString)
    blist(options.bucket)

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:1)

<击> 你错过了很多。

  1. filename在哪里给出值?
  2. keyString在哪里给出值?
  3. bucket在哪里给出值?
  4. 您不应将您的函数命名为list,因为它是原始类型
  5. 您可能想查看optparse tutorial。我假设你期望bucket--list命令行参数接收值。该值将存储到options.bucket中。这只是一个开始。

    我认为您想要更改main的结尾以检查选项并调用相应的函数。类似的东西:

    def main():
        # much omitted
        if options.filename is not None:
            downnload(options.filename, keyString)
        elif options.bucket is not None:
            blist(options.bucket)
        else:
            print 'Either --download or --list is required.'
            parser.print_help()
            sys.exit(-1)
    

    我认为这就是你要找的东西。它根据传入的命令行参数决定调用哪个函数。例如,如果用户传递--download filename,则使用提供的文件名作为参数调用downnload函数。