我正在尝试制作一个使用argparse
模块来解析命令行选项的Python程序。
我想做一个可选的参数,可以命名也可以是位置参数。例如,我希望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
。我在OS X 10.8.4上使用Python 2.7.2。
编辑:我尝试了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')
,但是myScript -u batman
和myScript --user-name=batman
将打印Namespace(user_name='admin')
。我尝试在第一个
user-name
行中将名称user_name
更改为add_argument
,有时会导致命名空间中的batman
和admin
或错误,这取决于我如何运行程序。我尝试在第二个
user_name
行中将名称user-name
更改为add_argument
,但这将打印Namespace(user-name='batman', user_name='admin')
或Namespace(user-name='admin', user_name='batman')
,具体取决于我如何运行程序。 最佳答案
ArgumentParser的工作方式是,在解析了可选参数之后,它始终会检查任何尾随的位置参数。因此,如果您有一个与可选参数同名的位置参数,并且它没有出现在命令行的任何位置,则可以确保覆盖该可选参数(使用其默认值或无)。
坦白说,这对我来说似乎是个错误,至少在相互排斥的组中使用时,因为如果您明确指定了参数,那将是一个错误。
也就是说,我建议的解决方案是为位置参数指定一个不同的名称。
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('-u','--username')
group.add_argument('static_username',nargs='?',default='admin')
然后在解析时,使用可选的用户名(如果存在的话),否则回退到位置static_username。
results = parser.parse_args()
username = results.username or results.static_username
我意识到这不是一个特别整洁的解决方案,但是我认为任何答案都不会。
关于Python argparse : command-line argument that can be either named or positional,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17598141/