这是我在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)
有没有干净的解决方案?
答案 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/file
和host:/path/to/remote/file
(虽然rsync
之类的语法使用了这种语法,但请记住,路径名中的冒号:
存在问题。)