Python argparse:可以命名或位置的命令行参数

2023-11-23

我正在尝试制作一个使用以下命令的 Python 程序argparse解析命令行选项的模块。

我想创建一个可以命名或位置的可选参数。例如,我想要myScript --username=batman做同样的事情myScript batman。我也想要myScript没有用户名才有效。这可能吗?如果可以的话,该怎么办呢?

我尝试了与下面的代码类似的各种操作,但没有成功。

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-u", "--user-name", default="admin")
group.add_argument("user-name", default="admin")
args = parser.parse_args()

EDIT:上面的代码抛出一个异常说ValueError: mutually exclusive arguments must be optional.

我在 OS X 10.8.4 上使用 Python 2.7.2。

EDIT:我尝试了 Gabriel Jacobsohn 的建议,但无法在所有情况下都能正常工作。

我试过这个:

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-u", "--user-name", default="admin", nargs="?")
group.add_argument("user_name", default="admin", nargs="?")
args = parser.parse_args()
print(args)

和跑步myScript batman会打印Namespace(user_name='batman'), but myScript -u batman and myScript --user-name=batman会打印Namespace(user_name='admin').

我尝试更改名称user-name to user_name在第一add_argument线,有时会导致两者batman and admin在名称空间或错误中,具体取决于我如何运行程序。

我尝试更改名称user_name to user-name在第二个add_argument行,但会打印Namespace(user-name='batman', user_name='admin') or Namespace(user-name='admin', user_name='batman'),取决于我如何运行程序。


方式参数解析器有效,它总是在解析可选参数后检查任何尾随位置参数。因此,如果您有一个与可选参数同名的位置参数,并且它没有出现在命令行的任何位置,则保证会覆盖可选参数(使用其默认值或None).

坦率地说,这对我来说似乎是一个错误,至少在互斥组中使用时是这样,因为如果您显式指定了参数,那将是一个错误。

也就是说,我建议的解决方案是给位置参数一个不同的名称。

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('-u','--username')
group.add_argument('static_username',nargs='?',default='admin')

然后在解析时,使用可选的username如果存在,否则回退到位置静态用户名.

results = parser.parse_args()
username = results.username or results.static_username

我意识到这不是一个特别巧妙的解决方案,但我认为任何答案都不会。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python argparse:可以命名或位置的命令行参数 的相关文章

随机推荐