在多个自定义模块支持下,在多个脚本中使用Python的argparse

9 投票
1 回答
6335 浏览
提问于 2025-04-17 19:36

我正在编写一套脚本和模块,用来管理我们的基础设施。为了保持事情的有序,我希望尽可能整合工作,减少新脚本中的重复代码。

这里主要的问题是要整合ArgumentParser模块。

一个例子结构可能是这样的,脚本和库的组织方式如下:

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

在这个情况下,script1 可能只使用 loggerlib1,而 script2 则会使用 loggerlib2。在这两种情况下,我希望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...

撰写回答