Python optparse:如何制作可重复的选项组?

时间:2013-05-24 10:04:51

标签: python optparse

这是我在python中编程的脚本的简化视图:

  • 该脚本用于比较两个文件。
  • 必须指定每个文件的类型(本地或远程)( 强制性
  • 对于本地文件:

    • 必须指定其文件名( 强制性
    • 可以指定其路径( 可选 ,默认为.
  • 对于远程文件:

    • 必须指定其文件名( 强制性
    • 必须指定其路径( 强制性
    • 可以指定布尔标志( 可选

所以我想像这样使用它:

compare.py -L local.txt -L local2.txt -p /tmp/

compare.py -L local.txt -R remote.txt -p remoteDir/ --myFlag

所以我需要定义2组选项(本地/ L和远程/ R),每组都包含自己的一组强制和可选选项。

我找不到使用optparse(甚至是argparse来实现此目的的方法,但如果可能的话,我想坚持使用optparse,因为我正在编写脚本Python 2.6.7)

有没有干净的解决方案?

2 个答案:

答案 0 :(得分:2)

我会用option callbacks +辅助对象来跟踪当前选项的上下文。例如:

from optparse import OptionParser

class FileBase(object):
    def __init__(self, fname):
        self.fname = fname
        self.path = None
class LocalFile(FileBase):
    pass
class RemoteFile(FileBase):
    pass

class FileOptionParser(object):
    def __init__(self):
        self.last_file = None
        self.files = []

    def set_path(self, option, opt, value, parser):
        self.last_file.path = value

    def set_file(self, option, opt, value, parser):
        if   option.dest=="local" : cls = LocalFile
        elif option.dest=="remote": cls = RemoteFile
        else:                       assert False
        self.last_file = cls(value)
        self.files.append(self.last_file)
        setattr(parser.values, option.dest, self.last_file)

fop = FileOptionParser()

parser = OptionParser()
parser.add_option('-L', '--local',  type='string', action='callback', callback=fop.set_file)
parser.add_option('-R', '--remote', type='string', action='callback', callback=fop.set_file)
parser.add_option('-p', '--path',   type='string', action='callback', callback=fop.set_path)

(options, args) = parser.parse_args()
print [(f.fname, f.path) for f in fop.files]

示例是:

> python test.py -L local.txt -R remote.txt -p remoteDir/
[('local.txt', None), ('remote.txt', 'remoteDir/')]

答案 1 :(得分:0)

我认为答案是你不再讨论选项,而是讨论参数到你的程序。 选项是修饰符,可以(可选)给出影响程序行为的修饰符;另一方面的参数是程序应该处理的输入数据(在某些情况下除了stdin之外)。

说完之后,我认为你应该使你的可选布尔标志成为一个选项,并在optparse完成其工作之后解析所有其他信息参数。找出一个简洁的语法来指定什么参数指定本地文件以及指定远程文件的内容,例如: G。 /path/to/local/filehost:/path/to/remote/file(虽然rsync之类的语法使用了这种语法,但请记住,路径名中的冒号:存在问题。)