我想模拟大多数命令行实用程序的行为,其中可选参数可以放在命令行中的任何位置,包括位置参数之间,例如在此mkdir示例中:
mkdir before --mode 077 after
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们知道这--mode恰好需要 1 个参数,因此before和after都被视为位置参数。可选部分 ,--mode 077实际上可以放在命令行中的任何位置。
但是,使用argparse,以下代码不适用于此示例:
# mkdir.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--mode', nargs=1)
parser.add_argument('dirs', nargs='*')
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
运行./mkdir.py before --mode 077 after结果:
mkdir.py: error: unrecognized arguments: after
Run Code Online (Sandbox Code Playgroud)
如何argparse在位置参数之间接受可选参数(具有固定的、已知数量的项目)?
从Python 3.7开始,似乎argparse现在支持这种Unix风格的解析:
混合解析
ArgumentParser.parse_intermixed_args(args=None, namespace=None)许多 Unix 命令允许用户将可选参数与位置参数混合。和
parse_intermixed_args()方法parse_known_intermixed_args()支持这种解析风格。
有一个警告,但对于“简单”选项,它不会影响它们:
这些解析器不支持所有 argparse 功能,如果使用不支持的功能,则会引发异常。特别是,
argparse.REMAINDER不支持子解析器、 和同时包含可选值和位置值的互斥组。
(我花了 1 个小时试图理解为什么 Pythonargparse文档中的示例似乎没有包含它,然后偶然发现了一个有点不相关的问题,其中包含对这个“混合”函数的提及一条评论,我无法再次找到正确引用它的评论。)
| 归档时间: |
|
| 查看次数: |
415 次 |
| 最近记录: |