代码之家  ›  专栏  ›  技术社区  ›  Giora Simchoni

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

  •  1
  • Giora Simchoni  · 技术社区  · 7 年前

    我在同一个包中有两个模块, module1.py module2.py .

    模1.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
    

    现在假设 模块2.Py 我进口 parse_arguments_module1() 模1.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)

    问题是:如何在 模块2.Py ( required 和/或 optional ) 额外的 那些 模1.Py ?(即有 args 在里面 main 包含更多参数,仅用于 模块2.Py )

    1 回复  |  直到 7 年前
        1
  •  1
  •   Martijn Pieters    7 年前

    你需要使用 partial parsing 具有 parser.parse_known_args() 为了实现你想要的,和/或明确地将你的参数作为一个列表传递。

    通常,没有参数 parser.parse_args() 从中获取所有值 sys.argv[1:] (所以除了第一个元素)作为要分析的输入。如果该列表中有无法分析的元素,则会打印一条错误消息,并 sys.exit(1) 调用;您的脚本将退出。

    所以如果你想要 一些 争论 sys.argv 要转到一个解析器,而将其余部分转到另一个解析器,您需要使用 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 ,使用相同的结构,但从 模块1 :

    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)
    
    推荐文章