【问题标题】:Determine function to execute from option used从使用的选项确定要执行的功能
【发布时间】:2011-03-23 00:42:19
【问题描述】:

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

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()

【问题讨论】:

    标签: python function scripting options


    【解决方案1】:

    你错过了很多。

    1. filename 的值在哪里?
    2. keyString 的值在哪里?
    3. bucket 的值在哪里?
    4. 不应将函数命名为 list,因为它是原始类型

    您可能想查看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 函数。

    【讨论】:

    • 我添加了更多相关代码,将列表更改为 blist 更新了使用 options.x 的函数,参数可以是某些选项的可选参数而其他选项是必需的吗?
    • 我没有注意到你问题的最后一部分。是的,看看"Handling boolean options" section
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2015-10-21
    • 2016-05-27
    相关资源
    最近更新 更多