首先,我很抱歉这个糟糕的头衔.我无法正确制定摘要的事实可能是我当前问题的80%.
我正在编写一个命令行程序来包装其他命令行程序,如下所示:
my_wrapper.py --some options -for --the wrapper original_program --and its -options
Run Code Online (Sandbox Code Playgroud)
在某些情况下,此命令将替换原始程序的调用:
original_program --and its -options
Run Code Online (Sandbox Code Playgroud)
我想提取包装器所需的选项,但保持原始程序名称和参数不变,顺序完全相同.我不能对包装程序的参数做出任何假设.
用argparse可以做到吗?如何?
我认为使用(已弃用)optparse
模块就像args
从行中读取一样简单
(options, args) = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
对于好奇的,包装器的目标是帮助用户在HPC群集上提交作业.它的职责是照顾我们编写自定义脚本,启动它和检索结果的所有特殊要求.
我想创建一个可选参数,它将是'-- '
(双破折号和空格)并将其后的所有内容作为其值.问题是之后可能会出现一些其他可选参数'-- '
.我不希望这些被解析为可选参数,而是作为值的值'-- '
.例如:
python prog1 --foo 1 --bar 2
Run Code Online (Sandbox Code Playgroud)
这里foo
和bar
是分别是值1
和值的可选参数2
python prog1 --foo 1 --bar 2 -- --foo 4 --bar 14
Run Code Online (Sandbox Code Playgroud)
在这里我希望foo
并且bar
之前'-- '
被解析为可选参数.但是我希望'--foo 4 --bar 14'
将其解析为可选参数的值'-- '
.我想这样做没有重命名而来后的参数'-- '
,以foo2
和bar2
,如果可能的话.
这可能吗?这怎么可能实现?
我有一个 Python 应用程序,它argparse
使用声明的一组参数来实现:
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"--arg1",
default="dev",
choices=["real", "test", "dev"],
help="arg 1"
)
parser.add_argument("--arg2", default="0", help="arg 2")
parser.add_argument(
"--arg3",
nargs="+",
default=["one", "two"],
choices=["one", "two"],
help="arg 3",
)
parser.add_argument("--arg4", action="store_true", help="arg 4")
parser.add_argument("--arg5", action="store_true", help="arg 5")
parser.add_argument("--arg6", action="store_true", help="arg 6")
parser.add_argument("--arg7", default=None, help="arg 7")
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
如果我发送这些声明中未定义的参数,则会出现以下异常:
error: unrecognized arguments: arg8 value
Run Code Online (Sandbox Code Playgroud)
是否可以指示argparse
接受未声明的参数?
在 Python 模块的文档中argparse
,3.8 文档指出nargs
可以设置为:
\n\n\n
argparse.REMAINDER
。所有剩余的命令行参数都收集到一个列表中。这对于分派到其他命令行实用程序的命令行实用程序通常很有用。
这已从3.9 文档中删除,尽管没有提到它已被弃用,也没有任何充分的理由这样做,因为它提供了其他方式显然没有提供的有用功能。\xc2\xb9 它的存在在页面的其他地方仍然提到:
\n\n\n这些[混合]解析器不支持所有 argparse 功能,如果使用不支持的功能,则会引发异常。特别是,不支持子解析器、argparse.REMAINDER 以及包含可选值和位置值的互斥组。
\n
但即使如此,[3.10 文档] 中也删除了这一点。然而,即使在最新发布的 Python 3.11.4 版本中,该功能仍然存在。
\n那么为什么它从文档中删除了呢?
\n我问这个问题是因为这个答案似乎可能直接关系到我关于用 Python 编程参数解析器的其他几个相关问题。(我曾经、现在和可能继续使用的特定情况nargs=REMAINDER
足够大,我认为如有必要,它们应该作为单独的问题发布。)考虑因素包括:
(另请注意,此类问题的答案不仅取决于特定的上下文nargs=REMAINDER
使用的特定上下文,而且还可能被视为意见问题,这是将它们超出本问题范围的另一个原因。)
\xc2\xb9nargs=REMAINDER
与nargs=\'*\'
: using不同,using 意味着 argparse从那时起REMAINDER
不会尝试解析选项(以 …