Python argparse:命令行参数,可以是名称或位置

2024-04-29 18:39:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图制作一个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()

编辑:上面的代码抛出一个异常,称为ValueError: mutually exclusive arguments must be optional。在

我在OSX10.8.4上使用Python2.7.2。在

编辑:我试过加布里埃尔·雅各布森的建议,但我不能让它在所有情况下都能正常工作。在

我试过了:

^{pr2}$

运行myScript batman将打印Namespace(user_name='batman'),但myScript -u batman和{}将打印{}。在

我尝试在第1行中将user-name更改为user_name,这有时会导致名称空间中的batman和{},这取决于我如何运行程序。在

我试着在第二行中将user_name改为user-name,但这会根据我运行程序的方式打印Namespace(user-name='batman', user_name='admin')或{}。在


Tags: 代码name程序adddefaultparseradmingroup
3条回答

这里有一个解决方案,我认为它可以满足您的所有需求:

import argparse
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("-u", " user-name", default="admin")
    # Gather all extra args into a list named "args.extra"
    parser.add_argument("extra", nargs='*')
    args = parser.parse_args()
    # Set args.user_name to first extra arg if it is not given and len(args.extra) > 0
    if args.user_name == parser.get_default("user_name") and args.extra:
        args.user_name = args.extra.pop(0)
    print args

如果运行myScript -u batmanmyScript user-name=batmanargs.user_name将被设置为“蝙蝠侠”。如果你这样做,myScript batmanargs.user_name又被设置为“蝙蝠侠”。最后,如果您只执行myScriptargs.user_name被设置为'admin'。在

另外,作为一个额外的好处,您现在拥有了传递给存储在args.extra中的脚本的所有额外参数。希望这有帮助。在

按照ArgumentParser的工作方式,它总是在解析了可选参数之后检查任何尾随的位置参数。因此,如果您有一个与可选参数同名的位置参数,并且它没有出现在命令行的任何位置,那么可以保证覆盖可选参数(使用其默认值或None)。在

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

也就是说,我建议的解决方案是给positional论点起一个不同的名字。在

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

然后在解析时,使用可选的用户名,否则返回到位置静态用户名。在

^{pr2}$

我知道这不是一个特别好的解决办法,但我不认为任何答案会是。在

尝试使用add_参数方法的“nargs”参数。 这样对我有效。 现在你可以添加两次用户名, 所以如果你想的话,你必须检查它并提出一个错误。在

import argparse
if __name__ == '__main__':
   parser = argparse.ArgumentParser()
   parser.add_argument("-u", " user-name", default="admin")
   parser.add_argument("user_name", default="admin", nargs="?")
   args = parser.parse_args()
   print(args)

相关问题 更多 >