Eli*_*ria 11 python python-2.x command-line-arguments python-2.7 argparse
我正在尝试制作一个使用该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()
Run Code Online (Sandbox Code Playgroud)
编辑:上面的代码抛出异常说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)
Run Code Online (Sandbox Code Playgroud)
并运行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的作品,它总是会检查任何尾随的位置参数已经解析的可选参数之后.因此,如果您有一个与可选参数同名的位置参数,并且它不会出现在命令行的任何位置,则可以保证覆盖可选参数(使用其默认值或None).
坦率地说,这对我来说似乎是一个错误,至少在互斥组中使用时,因为如果你明确指定了参数,那将是一个错误.
也就是说,我建议的解决方案是给位置参数一个不同的名称.
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('-u','--username')
group.add_argument('static_username',nargs='?',default='admin')
Run Code Online (Sandbox Code Playgroud)
然后在解析时,使用可选的用户名(如果存在),否则回退到位置static_username.
results = parser.parse_args()
username = results.username or results.static_username
Run Code Online (Sandbox Code Playgroud)
我意识到这不是一个特别简洁的解决方案,但我认为没有任何答案.
小智 5
这是一个解决方案,我认为它可以满足您的所有需求:
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
Run Code Online (Sandbox Code Playgroud)
如果您运行myScript -u batman或myScript --user-name=batman,args.user_name则设置为“蝙蝠侠”。如果你这样做myScript batman,args.user_name再次设置为“蝙蝠侠”。最后,如果你只是这样做myScript,args.user_name设置为'admin'。
此外,作为一个额外的好处,您现在可以将所有传递给脚本的额外参数存储在args.extra. 希望这可以帮助。
小智 0
尝试使用 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)
Run Code Online (Sandbox Code Playgroud)