【问题标题】:Partial parsing with argparse使用 argparse 进行部分解析
【发布时间】:2021-07-24 03:46:48
【问题描述】:

我目前正在为 python 中的 git 编写一个包装器,它允许在多个 git 存储库中运行某些 git 命令。现在,我想支持所有可能的 git 命令,我想通过以下方式做到这一点:我希望 argparse 只解析全局选项和子命令;子命令之后的所有内容(这是一个 git 命令)我只想按原样传递给 git。

argparse 可以做到这一点吗?

例子:

            Passed on to git as-is
            vvvvv
mgit -t add -p .
^^^^^^^^^^^
Parsed by argparse 

【问题讨论】:

  • 你试过使用add_argument()nargs参数吗?:docs.python.org/3/library/argparse.html#nargs
  • 嗯。我想在我的脚本中对 git 内部的了解尽可能少;所以我不想列出所有的 git 命令;我只想接受任何子命令和它可能得到的任何参数。
  • ..but nargs="*" 可能是我的问题的部分解决方案..
  • @jramsey 哦,这几乎可以完美运行!我唯一的问题是我想使用我自己的与 git 参数冲突的全局参数,这会打乱参数解析。
  • 双破折号参数“--”可能很有用,允许您将所有剩余参数解析为纯字符串,即使它们包含“-”。还有一个argparse.REMINDER nargs 值,尽管这不是很可靠。 parse_known_args 也可能有用。

标签: python git argparse


【解决方案1】:

我以前做过类似的事情! argparse 的一个不太常用的选项是提供您自己的字符串数组的能力。默认情况下,它查看 sys.argv[1:],但您可以根据需要以不同方式处理 argv。我建议像这样构建命令:

mgit -t -- add -p .

-- 分隔您希望子命令开始的位置。示例

parser = ArgumentParser(...)
...

delimit_index = sys.argv.index("--")
args = parser.parse_args(args=sys.argv[1:delimit_index])
subcommand_args = sys.argv[delimit_index + 1:]

【讨论】:

  • 感谢您的回答!我选择混合手动解析和使用 argparse 进行内部命令。
猜你喜欢
  • 2013-09-13
  • 1970-01-01
  • 2013-02-07
  • 2018-12-14
  • 2021-07-25
  • 1970-01-01
相关资源
最近更新 更多