当前位置: 首页 > 知识库问答 >
问题:

从python/argparse中删除参数(不使用parse_known_args)

杜砚
2023-03-14

我有两个程序,一个是另一个的包装器。

主程序的args顺序为arg one,--arg1,--arg2包装程序具有主程序的所有args,以及其他args--arg3,--arg4

我希望能够将参数从包装器传递到主程序,而不会出现“参数未识别”错误。然而,我不想使用parse_known_args,因为如果用户犯了一个错别字或使用了一个荒谬的论点,他们就不会收到任何反馈。(这个问题我已经看过了)

除了手动搜索每个参数名称,然后搜索紧跟在该名称之后的任何值(如果该名称存在并且该参数在is之后需要参数),还有没有更优雅的方法来清理某些值集的参数,以便将它们传递给另一个解析器?

共有1个答案

狄卓君
2023-03-14

混合各种部分解析的例子:

import argparse

def foo(parser, alist):
   for arg in alist:
        parser.add_argument('--'+arg, action='store_true')

parser1 = argparse.ArgumentParser()
foo(parser1, ['arg1','arg2'])

parser2 = argparse.ArgumentParser()
foo(parser2, ['arg3','arg4'])

parser12 = argparse.ArgumentParser()
foo(parser12, ['arg1','arg2','arg3','arg4'])

args = parser12.parse_args()
print('p12', args)

args, extras = parser2.parse_known_args()
print('p2',args, extras)

args = parser1.parse_args(extras)
print('p1',args)

args, extras = parser1.parse_known_args()
print('p1p',args, extras)

无:

1714:~/mypy$ python3 stack47866170.py 
p12 Namespace(arg1=False, arg2=False, arg3=False, arg4=False)
p2 Namespace(arg3=False, arg4=False) []
p1 Namespace(arg1=False, arg2=False)
p1p Namespace(arg1=False, arg2=False) []

全部:

1722:~/mypy$ python3 stack47866170.py --arg1 --arg2 --arg3 --arg4
p12 Namespace(arg1=True, arg2=True, arg3=True, arg4=True)
p2 Namespace(arg3=True, arg4=True) ['--arg1', '--arg2']
p1 Namespace(arg1=True, arg2=True)
p1p Namespace(arg1=True, arg2=True) ['--arg3', '--arg4']

子集

1723:~/mypy$ python3 stack47866170.py --arg1 --arg2
p12 Namespace(arg1=True, arg2=True, arg3=False, arg4=False)
p2 Namespace(arg3=False, arg4=False) ['--arg1', '--arg2']
p1 Namespace(arg1=True, arg2=True)
p1p Namespace(arg1=True, arg2=True) []
1723:~/mypy$ python3 stack47866170.py --arg1 --arg3
p12 Namespace(arg1=True, arg2=False, arg3=True, arg4=False)
p2 Namespace(arg3=True, arg4=False) ['--arg1']
p1 Namespace(arg1=True, arg2=False)
p1p Namespace(arg1=True, arg2=False) ['--arg3']

错误-被parser12捕获:

1724:~/mypy$ python3 stack47866170.py --arg1 --foo
usage: stack47866170.py [-h] [--arg1] [--arg2] [--arg3] [--arg4]
stack47866170.py: error: unrecognized arguments: --foo
 类似资料:
  • 问题内容: 是否可以在Python的用法或帮助()中不显示参数的情况下将其添加到python中? 问题答案: 是的,您可以将选项设置为。这是argparse文档中的示例:

  • 问题内容: 我在python中删除sqlite3表时遇到问题。我正在使用标准模块。 给我 当我更改为: 它工作正常。 问题答案: 您不能将参数用于表名或列名。 或者,您可以将其分为两个步骤,例如: 如果这样做,则可能要明确指定可以删除的表…

  • 我正在使用python和argparse编写脚本: 我希望能够运行它与python3parseab.py-a 11-b 22-a 33,和函数A将执行两次与11和33,和函数B一次与22。 现在每个功能只发生一次。 *我不想在每个选项后接受更多参数,而是希望能够接受同一函数的多个实例。 谢谢你!

  • 问题内容: Python2.7 argparse仅在互斥组中接受可选参数(前缀): $ mydaemon -h 有没有一种方法可以使argparse参数的行为类似于传统的unix守护程序控件: 问题答案: 对于其中的所有功能和选项,我认为您永远不会获得看起来像您想要的“罐头”用法字符串。 也就是说,自您的原始帖子起,您是否查看过子解析器? 这是一个准系统的实现: 使用选项运行此命令将产生: 这种方

  • 我想从以下页面中删除“符号”、“名称”和“收益通话时间”下的所有公司信息:https://finance.yahoo.com/calendar/earnings 到目前为止,我只知道公司名称,但我得到了一个错误: NoSuchElementException:没有这样的元素:无法定位元素:{“方法”:“xpath”,“选择器”:“/*[@id='cal-res-table']]/div[1]/ta

  • 我正在使用gradle构建一个Spring Boot应用程序,我希望从war中删除文件,因为该文件将从外部加载(它运行在tomcat容器中,而不是嵌入式的)。 我查看了StackOverflow和Gradle文档,试图找出该做什么,但我不知道该绑定到哪个阶段,以及在创建war之前还是之后排除该文件。处理文件似乎也有多种方法。 我相信Maven使用作为等价物。