在多个自定义模块支持下,在多个脚本中使用Python的argparse
我正在编写一套脚本和模块,用来管理我们的基础设施。为了保持事情的有序,我希望尽可能整合工作,减少新脚本中的重复代码。
这里主要的问题是要整合ArgumentParser模块。
一个例子结构可能是这样的,脚本和库的组织方式如下:
|-- bin
|-- script1
|-- script2
|-- lib
|-- logger
|-- lib1
|-- lib2
在这个情况下,script1
可能只使用 logger
和 lib1
,而 script2
则会使用 logger
和 lib2
。在这两种情况下,我希望logger能够接受 '-v' 和 '-d' 这两个参数,同时 script1
可能还会接受其他参数,而 lib2
也会有其他参数。我知道这可能会导致参数冲突,所以我会手动处理这个问题。
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
logger
#!/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.")
每个脚本和库都有可能有自己的参数,但这些参数最终都需要整合到一个最终的 arg_parse() 中。
到目前为止,我的尝试都没有成功地继承或扩展 argp 的设置。我该如何在库文件和脚本之间做到这一点呢?
1 个回答
13
最简单的方法就是在每个模块里写一个方法,这个方法可以接收一个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...