0

我有一系列 Python 脚本。有些用于argparse处理传递给它们的命令行参数;其他人没有。

我想通过另一个 Python 脚本遍历所有这些脚本,并为每个脚本列出它接受的参数,它们是强制性的还是可选的,它们的类型是什么,以及默认值是什么(如果有)。

有什么方便的方法来做到这一点?

我考虑过使用--help参数执行这些脚本,并进行解析stdout,但这有四个警告:

  • 解析stdout可能没有那么简单。
  • 我的应用程序会特别脆弱:每当输出格式argparse发生变化时,它就可能中断。
  • 一些脚本可能不支持该--help参数,并开始执行各自的任务;我不想要那个。
  • 默认值不包含在帮助中。

我也考虑过导入脚本,但看起来没有帮助。毕竟,大多数参数处理块都以 为条件if __name__ == "__main__":,因此感兴趣的代码甚至不会执行。

我还有哪些其他选择?

4

1 回答 1

0

ipython会话中,这给出了由简单解析器脚本创建的对象的概念。 add_argument创建一个Action子类对象,放入一个列表,并返回它。由于这些是 Python 对象,因此可以检查(甚至修改)它们的属性。

In [1]: import argparse
In [2]: parser = argparse.ArgumentParser()
In [3]: type(parser)
Out[3]: argparse.ArgumentParser
In [4]: print(parser)
ArgumentParser(prog='ipython3', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
In [5]: parser.add_argument('-f','--foo')
Out[5]: _StoreAction(option_strings=['-f', '--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [6]: parser.add_argument('bar')
Out[6]: _StoreAction(option_strings=[], dest='bar', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [7]: parser._actions
Out[7]: 
[_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None),
 _StoreAction(option_strings=['-f', '--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None),
 _StoreAction(option_strings=[], dest='bar', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)]
In [8]: vars(parser._actions[1])
Out[8]: 
{'option_strings': ['-f', '--foo'],
 'dest': 'foo',
 'nargs': None,
 'const': None,
 'default': None,
 'type': None,
 'choices': None,
 'required': False,
 'help': None,
 'metavar': None,
 'container': <argparse._ArgumentGroup at 0x7f8a1f73dac8>}

-hor生成的帮助parser.format_help是从这些对象创建的 - theparserActions(and groups)。解析也适用于这些。所以一切都存在。但我不会从我自己对parser说明的阅读中推断出所有这些——这相当于重新创建argparse.py代码。

于 2020-09-15T18:26:33.120 回答