Pau*_*lan 5 python command-line parsing
我正在开发一个管理脚本,通过大量的命令行选项完成相当多的工作.脚本的前几次迭代使用optparse来收集用户输入,然后向下运行页面,以适当的顺序测试每个选项的值,并在必要时执行操作.这导致了一个非常难以阅读和维护的密码丛林.
我正在寻找更好的东西.
我希望有一个系统,我可以用或多或少的正常python方式编写函数,然后在运行脚本时,从我的函数生成选项(和帮助文本),解析并以适当的顺序执行.另外,我真的很想能够构建django风格的子命令接口,它们myscript.py install
完全独立于myscript.py remove
(单独的选项,帮助等).
我找到了simon willison的optfunc并且它做了很多这个,但似乎只是错过了标记 - 我想把每个OPTION写成一个函数,而不是试图将整个选项集压缩成一大串选项.
我想象一个架构涉及一组主要功能的类,以及每个与命令行中特定选项对应的类的定义方法.这种结构的优点是每个选项都位于它修改的功能代码附近,从而简化了维护.我不知道如何处理的事情是命令的排序,因为类方法的排序不是确定性的.
在我重新发明轮子之前:还有其他现有的代码行为类似吗?其他容易修改的东西?问这个问题已经澄清了我自己对什么是好的想法,但是反馈为什么这是一个可怕的想法,或者它应该如何工作将是受欢迎的.
不要把时间浪费在“自省”上。
每个“命令”或“选项”都是一个具有两组方法函数或属性的对象。
向 optparse 提供设置信息。
切实做好工作。
这是所有命令的超类
class Command( object ):
name= "name"
def setup_opts( self, parser ):
"""Add any options to the parser that this command needs."""
pass
def execute( self, context, options, args ):
"""Execute the command in some application context with some options and args."""
raise NotImplemented
Run Code Online (Sandbox Code Playgroud)
您可以为Install
和Remove
以及您需要的每个其他命令创建子类。
您的整体应用程序看起来像这样。
commands = [
Install(),
Remove(),
]
def main():
parser= optparse.OptionParser()
for c in commands:
c.setup_opts( parser )
options, args = parser.parse()
command= None
for c in commands:
if c.name.startswith(args[0].lower()):
command= c
break
if command:
status= command.execute( context, options, args[1:] )
else:
logger.error( "Command %r is unknown", args[0] )
status= 2
sys.exit( status )
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
380 次 |
最近记录: |