【发布时间】:2018-03-21 22:13:27
【问题描述】:
我正在使用 Python 2.7,并且正在尝试使用 argparse 完成类似 shell 的行为。 我的问题,一般来说,我似乎无法在 Python 2.7 中找到一种方法来使用 argparse 的子解析器作为可选。 解释我的问题有点困难,所以我将描述我对程序的要求。
该程序有两种工作模式:
- 使用给定命令启动程序(每个命令都有自己的 附加参数)和附加参数将运行特定的 任务。
- 在没有命令的情况下启动程序将启动一个类似于 shell 的程序,该程序可以接受一行参数并处理它们,就像 程序是用给定的行作为它的参数调用的。
所以,例如,如果我的程序支持“cmd1”和“cmd2”命令,我可以这样使用它:
python program.py cmd1 additional_args1python program.py cmd2 additional_args2
或使用 shell 模式:
-
python program.pycmd1 additional_args1cmd2 additional_args2quit
此外,我还希望我的程序能够采用将影响所有命令的可选全局参数。
为此我使用 argparse 像这样(这是一个纯粹的例子):
parser = argparse.ArgumentParser(description="{} - Version {}".format(PROGRAM_NAME, PROGRAM_VERSION))
parser.add_argument("-i", "--info", help="Display more information")
subparsers = parser.add_subparsers()
parserCmd1 = subparsers.add_parser("cmd1", help="First Command")
parserCmd1.set_defaults(func=cmd1)
parserCmd2 = subparsers.add_parser("cmd2", help="Second Command")
parserCmd2.add_argument("-o", "--output", help="Redirect Output")
parserCmd2.set_defaults(func=cmd2)
所以我可以调用 cmd1(没有额外的参数)或 cmd2(有或没有 -o 标志)。对于两者,我都可以添加标志 -i 以显示被调用命令的更多信息。
我的问题是我无法激活 shell 模式,因为我必须提供 cmd1 或 cmd2 作为参数(因为使用了必需的子解析器)
限制:
- 我不能使用 Python 3(我知道在那里很容易做到)
- 由于全局可选参数,我无法检查是否没有参数可以跳过 arg 解析。
- 我不想添加一个新的命令来调用shell,它必须是在根本不提供任何命令时
那么如何使用 argparse 和 python 2.7 实现这种行为呢?
【问题讨论】:
-
只是一个简短的说明 - 子解析器是可选的这一事实是一个错误。它们曾经是必需的(就像正常的位置一样),但在几年前的一次不相关的变化中,子解析器从裂缝中消失了。我将不得不更详细地研究您的问题,以了解您为什么认为 Py2 和 Py3 在这方面存在差异。
标签: python-2.7 argparse subparsers