在由多个自定义模块支持的多个脚本中使用python的argparse

时间:2013-03-19 08:26:20

标签: python inheritance command-line-arguments argparse

我正在构建一组用于管理基础架构的脚本和模块。为了保持井井有条,我希望尽可能地加以努力,并尽量减少新版脚本的底板。

特别是这里的问题是合并ArgumentParser模块。

示例结构是将脚本和库组织成如下:

|-- bin
    |-- script1
    |-- script2
|-- lib
    |-- logger
    |-- lib1
    |-- lib2

在这种情况下,script1可能只会使用loggerlib1,而script2会使用loggerlib2。在这两种情况下,我希望记录器接受'-v'和'-d',而script1也可以接受其他args和lib2其他args。我知道这会导致冲突,并会手动管理。

SCRIPT1

#!/usr/bin/env python
import logger
import lib1
argp = argparse.ArgumentParser("logger", parent=[logger.argp])

SCRIPT2

#!/usr/bin/env python
import logger
import lib2

记录器

#!/usr/bin/env python
import argparse
argp = argparse.ArgumentParser("logger")
argp.add_argument('-v', '--verbose', action="store_true", help="Verbose output")
argp.add_argument('-d', '--debug', action="store_true", help="Debug output. Assumes verbose output.")

每个脚本和lib都可能有它自己的参数,但是这些都必须合并到一个最终的arg_parse()

到目前为止,我的尝试导致无法继承/扩展argp设置。如何在库文件和脚本之间完成?

1 个答案:

答案 0 :(得分:7)

最简单的方法是在每个模块中使用一个接受ArgumentParser实例的方法并为其添加自己的参数。

# logger.py
def add_arguments(parser):
    parser.add_argument('-v', '--verbose', action="store_true", help="Verbose output")
    # ...

# lib1.py
def add_arguments(parser):
    parser.add_argument('-x', '--xtreme', action="store_true", help="Extremify")
    # ...

每个脚本都会创建自己的ArgumentParser,将其传递给每个提供参数的模块,然后添加自己的特定参数。

# script1.py
import argparse, logger, lib1
parser = argparse.ArgumentParser("script1")
logger.add_arguments(parser)
lib1.add_arguments(parser)
# add own args...