Python:除了来自外部函数的命令行参数外,还使用argparse读取命令行args

时间:2018-10-22 12:09:48

标签: python argparse

我在同一软件包中有两个模块,module1.pymodule2.py

module1.py中,我有一个函数用argparse读取命令行参数:

import argparse

def parse_arguments_module1():
    parser = argparse.ArgumentParser()
    optional = parser._action_groups.pop()
    required = parser.add_argument_group('required arguments')
    required.add_argument('--argA', help='argA', required=True)
    required.add_argument('--argB', help='argB', required=True)
    optional.add_argument('--argC', help='argC')
    optional.add_argument('--argD', help='argD')
    parser._action_groups.append(optional)
    args = parser.parse_args()
    return args

现在假设在module2.py中,我从parse_arguments_module1()导入了module1.py并使用了它(有效):

from module1 import parse_arguments_module1

if __name__ == '__main__':
    args = parse_arguments_module1()
    print(args)

使用:

python3 module2.py --argA A --argB B --argC C

输出:

  

命名空间(argA ='A',argB ='B',argC ='C',argD = None)

问题是:如何读取module2.pyrequired和/或optional和/或module1.py)中的参数? (即args中的main包含更多的参数,仅用于module2.py

1 个答案:

答案 0 :(得分:1)

您需要将partial parsingparser.parse_known_args()结合使用以实现所需的目标,和/或显式地将参数作为列表传递。

通常,没有参数parser.parse_args()会将sys.argv[1:]中的所有值(除了第一个元素以外的所有值)都用作解析的输入。如果该列表中有某些元素无法解析,则会显示错误消息并调用sys.exit(1);您的脚本将退出。

因此,如果您希望sys.argv上的 some 个参数进入一个解析器,而其余部分传递给另一个解析器,则您想使用parser.parse_known_args()并将其余部分传递给另一个解析器。解析器。

我从解析中拆分出创建和配置ArgumentParser()实例的过程;因此在module1中这样做:

def module1_argument_parser():
    parser = argparse.ArgumentParser()
    optional = parser._action_groups.pop()
    required = parser.add_argument_group('required arguments')
    required.add_argument('--argA', help='argA', required=True)
    required.add_argument('--argB', help='argB', required=True)
    optional.add_argument('--argC', help='argC')
    optional.add_argument('--argD', help='argD')
    parser._action_groups.append(optional)
    return parser

def parse_arguments_module1(args=None):
    parser = module1_argument_parser()
    return parser.parse_args(args)

if __name__ == '__main__':
    args = parse_arguments_module1()
    print(args)

,并且在module2中,使用相同的结构,但是重新使用module1中的解析器:

from module1 import module1_argument_parser

def module2_argument_parser():
    parser = argparse.ArgumentParser()
    # create argument switches, etc.
    return parser

def parse_arguments_module2(args=None):
    parser = module2_argument_parser()
    return parser.parse_args(args)

if __name__ == '__main__':
    module1_parser = module1_argument_parser()
    module1_args, remainder = module1_parser.parse_known_args()
    module2_args = parse_arguments_module2(remainder)
    print(module1_args)
    print(module2_args)