代码之家  ›  专栏  ›  技术社区  ›  O.rka

如何从python3中的现有程序创建带有argparse的子parser?

  •  0
  • O.rka  · 技术社区  · 6 年前

    原职务:

    如果有一个可执行文件 mini_program.py argparse

    def main():
        parser = argparse.ArgumentParser()
        parser.add_argument('-X', '--attribute_matrix', type=str, help = 'Input: Path/to/Tab-separated-value.tsv')
        parser.add_argument('-y', '--target_vector', type=str, help = 'Input: Path/to/Tab-separated-value.tsv')
        opts = parser.parse_args()
    
    if __name__ == "__main__":
        main()
    

    如何创建控制器程序 parent_program.py 使用 argparse参数 (我认为 subparser ?) 类似用法如下:

    python parent_program.py --help
    
    blah-blah list of programs that can be used
    

    python parent_program.py mini_program --help
    
    -X description
    -y description
    etc...
    

    所有的参数是如何从 迷你型_程序.py 家长_程序.py ?

    程序

    import argparse
    def main():
        parser = argparse.ArgumentParser()
        # Subprograms
        subprograms = parser.add_subparsers(title="subprograms")
        # ============
        # mini-program
        # ============
        parser_miniprogram = subprograms.add_parser("miniprogram")
    
        # Input
        parser_miniprogram.add_argument('-X', '--attribute_matrix', type=str, help = 'Input: Path/to/Tab-separated-value.tsv')
        parser_miniprogram.add_argument('-y', '--target_vector', type=str, help = 'Input: Path/to/Tab-separated-value.tsv')
        opts = parser.parse_args()
        opts_miniprogram = parser_miniprogram.parse_args()
        print(opts_miniprogram.__dict__)
    
    if __name__ == "__main__":
        main()
    

    检查以确保文件正常工作

    # parent program
    python parent_program.py --help
    usage: parent_program.py [-h] {miniprogram} ...
    
    optional arguments:
      -h, --help     show this help message and exit
    
    subprograms:
      {miniprogram}
    
    # miniprogram
    python parent_program.py miniprogram --help
    usage: parent_program.py miniprogram [-h] [-X ATTRIBUTE_MATRIX]
                                         [-y TARGET_VECTOR]
    
    optional arguments:
      -h, --help            show this help message and exit
      -X ATTRIBUTE_MATRIX, --attribute_matrix ATTRIBUTE_MATRIX
                            Input: Path/to/Tab-separated-value.tsv
      -y TARGET_VECTOR, --target_vector TARGET_VECTOR
                            Input: Path/to/Tab-separated-value.tsv
    

    python parent_program.py miniprogram -X ../../Data/X_iris.noise_100.tsv.gz -y ../../Data/y_iris.tsv
    usage: parent_program.py miniprogram [-h] [-X ATTRIBUTE_MATRIX]
                                         [-y TARGET_VECTOR]
    parent_program.py miniprogram: error: unrecognized arguments: miniprogram
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   hpaulj    6 年前

    父程序可以有如下代码

    import mini_program
    import sys
    <do its own parsing>
    if 'use_mini':
        <modify sys.argv>
        mini_program.main()
    

    如前所述,导入 mini_program main 会的,但是使用它在 sys.argv .

    父解析器的编写方式应该使其能够接受所需的参数,并且不会因输入而阻塞 mini 想要,'-X'和'-y'。然后,它会将这些“额外”值放入修改后的 系统argv ,其中 迷你 解析器可以处理。

    parse_known_args https://docs.python.org/3/library/argparse.html#partial-parsing

    nargs=argparse.REMAINDER , https://docs.python.org/3/library/argparse.html#nargs

    迷你 主要的

    def main(argv=None):
        parser = argparse.ArgumentParser()
        parser.add_argument('-X', '--attribute_matrix', type=str, help = 'Input: Path/to/Tab-separated-value.tsv')
        parser.add_argument('-y', '--target_vector', type=str, help = 'Input: Path/to/Tab-separated-value.tsv')
        opts = parser.parse_args(argv)
    

    它可以用

    mini_program.main(['-X', 'astring','-y','another'])
    

    也就是说,有一个明确的 argv 列表,而不是 .

    阻止主解析器响应'-h'帮助可能很棘手。 subparsers

    迷你 . 我现在不想弄清楚那些细节。

    另一种定义 是:

    def main():
        parser = argparse.ArgumentParser()
        parser.add_argument('-X', '--attribute_matrix', type=str, help = 'Input: Path/to/Tab-separated-value.tsv')
        parser.add_argument('-y', '--target_vector', type=str, help = 'Input: Path/to/Tab-separated-value.tsv')
        return parser
    

     opts = main().parse_args()
     opts = mini_program.main().parse_args()
    

    换句话说,使用 定义解析器,但延迟解析。

        2
  •  0
  •   O.rka    6 年前

    # Controller
    def main(argv=None):
        parser = argparse.ArgumentParser(prog="parent_program", add_help=True)
        parser.add_argument("subprogram")
        opts = parser.parse_args(argv)
        return opts.subprogram
    
    
    # Initialize
    if __name__ == "__main__":
        # Get the subprogram 
        subprogram = main([sys.argv[1]])
        module = importlib.import_module(subprogram)
        module.main(sys.argv[2:])