我想将python-argparse与参数和位置参数一起使用。假设我在命令行上有我的脚本(这只是一个简单而愚蠢的例子),到目前为止这是我的代码:
#!/usr/bin/env python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', action='store_true')
subparsers = parser.add_subparsers(help='command', dest='command')
cmd1_parser = subparsers.add_parser('command1')
cmd1_parser.add_argument('--verbose', action='store_true')
args = parser.parse_args()
print args
现在我这样调用这个脚本:
~ $ myscript --verbose command1 --verbose
Namespace(command='command1', verbose=True)
~ $ myscript command1 --verbose
Namespace(command='command1', verbose=True)
~ $ myscript --verbose command1
Namespace(command='command1', verbose=True)
现在你可以看到我总是得到相同的Namespace-object,并且无法区分verbose命令是常规参数还是subparser参数。 但我需要分别处理这些参数。 这样做的最简单方法(使用最少的代码工作量)是什么?
修改:
我在Python stdlib问题跟踪器中提交了一个问题: http://bugs.python.org/issue15327
答案 0 :(得分:4)
将subparser的add_argument调用更改为:
cmd1_parser.add_argument('--verbose', action='store_true', dest='cmd1_verbose')
这将导致您的第一个示例返回:
~ $ myscript --verbose command1 --verbose
Namespace(cmd1_verbose=True, command='command1', verbose=True)
答案 1 :(得分:4)
这是我一起入侵的一些东西。我几乎可以保证它不是没有bug的,但它可以用于这个简单的测试。
import argparse
class _Action(object):
def __init__(self,master):
self.master=master
def add_parser(self,name,**kwargs):
self.master.subparsers[name]=subParserEnabler()
return self.master.subparsers[name]
class subParserEnabler(argparse.ArgumentParser):
def __init__(self,*args,**kwargs):
self.subparsers={}
argparse.ArgumentParser.__init__(self,*args,**kwargs)
def add_subparsers(self,**kwargs):
return _Action(self)
def parse_args(self,args,**kwargs):
args=list(args)
for k in self.subparsers.keys():
if k in args:
break
try:
i=args.index(k)
output=argparse.ArgumentParser.parse_args(self,args[:i],**kwargs)
o1=argparse.Namespace()
setattr(output,k,o1)
self.subparsers[k].parse_args(args[i+1:],namespace=o1)
except:
output=argparse.ArgumentParser.parse_args(self,args,**kwargs)
return output
parser = subParserEnabler()
parser.add_argument('--verbose', action='store_true')
subparsers = parser.add_subparsers(help='command',dest='command')
cmd1_parser = subparsers.add_parser('command1')
cmd1_parser.add_argument('--verbose', action='store_false')
args = parser.parse_args("--verbose command1 --verbose".split())
print args
它仍然缺少别名,帮助格式化可能是错误的......但至少它提供了我想要的输出。最终,John Gaines Jr的回答可能比我的简单得多。