我正在使用Python 2.7,并试图使用argparse完成类似shell的行为。 我的问题,一般来说,我似乎无法在Python 2.7中找到一种方法来使用argparse的子分析器作为可选项。 这是很难解释我的问题,所以我会描述我的程序需要什么。如何使用Argparse模块与Python 2.7设置默认的Subparser
该方案有2种模式工作:
- 与给定的命令启动程序(每个命令都有它自己的 附加参数)和其他参数将运行一个特定 任务。
- 不使用命令启动程序会启动一个类似shell的程序,它可以接收一行参数并对它们进行处理,就好像程序是使用给定行调用的参数一样。
因此,例如,如果我的程序支持 'CMD1' 和 'CMD2' 的命令,我可以用它像这样:
python program.py cmd1 additional_args1
python program.py cmd2 additional_args2
或壳模式:
python program.py
cmd1 additional_args1
cmd2 additional_args2
quit
另外,我也希望我的程序能够利用可选的全局参数,将影响所有命令。
对于我正在使用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作为参数
限制(因为使用它是强制性的subparsers的):
- 我不能使用Python 3(我知道在那里可以很容易地完成)
- 由于全局可选参数,我无法检查是否没有参数来跳过arg解析。
- 我不想增加一个新的命令调用外壳,在所有
所以不提供命令时,我怎样才能实现这种行为与argparse和Python 2.7它必须是?
只是一个快速的音符 - 事实上,subparsers是可选的是一个错误。他们曾经被要求(作为一个正常的位置),但在几年前一个不相关的变化,subparsers通过裂缝跌倒。我将不得不更详细地研究您的问题,以了解为什么您认为Py2和Py3在这方面存在差异。 – hpaulj