![](/img/trans.png)
[英]Python Argparse: Get the command-line argument used for a Namespace variable
[英]Python argparse: command-line argument that can be either named or positional
我正在尝试创建一个使用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')
。
我尝试在第一个add_argument
行中将名称user-name
更改为user_name
,这有时会导致命名空间中的batman
和admin
,或者出错,这取决于我运行程序的方式。
我尝试在第二个add_argument
行中将名称user_name
更改为user-name
,但是会打印Namespace(user-name='batman', user_name='admin')
或Namespace(user-name='admin', user_name='batman')
,取决于我如何运行该程序。
ArgumentParser的工作方式,它总是在解析可选参数后检查任何尾随位置参数。 因此,如果您有一个与可选参数同名的位置参数,并且它不会出现在命令行的任何位置,则可以保证覆盖可选参数(使用其默认值或None )。
坦率地说,这对我来说似乎是一个错误,至少在互斥组中使用时,因为如果你明确指定了参数,那将是一个错误。
也就是说,我建议的解决方案是给位置参数一个不同的名称。
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
我意识到这不是一个特别简洁的解决方案,但我认为没有任何答案。
这是一个解决方案,我认为你想做的一切:
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 batman
或myScript --user-name=batman
,则args.user_name
设置为“batman”。 如果你执行myScript batman
, args.user_name
再次设置为'batman'。 最后,如果您只是执行myScript
, args.user_name
设置为“admin”。
此外,作为额外的奖励,您现在拥有传递给存储在args.extra
的脚本的所有额外参数。 希望这可以帮助。
尝试使用add_argument方法的“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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.