我想知道我怎么能有这样的用法:
Usage: httpclient get [-v] [-h key: value] URL
基本上,现在,我将我的文件命名为httpclient.py,以便我可以通过httpclient调用它,其余的如下:
def main():
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("arg1", nargs='?')
parser.add_argument("arg2", nargs='?')
parser.add_argument("-v", nargs='?')
parser.add_argument("-h", '--h', nargs='?', action='append')
args = parser.parse_args()
if args.arg1 == "help" and (args.arg2 == "get" or args.arg2 == "post"):
if args.arg2 == "get":
gethelp()
elif args.arg2 == "post":
posthelp()
elif args.arg1 == "help":
help()
elif args.arg1 == "get":
if args.v:
print(sys.argv[-1])
get(args.v,1,args.h)
else:
get(sys.argv[2],0,args.h)
现在,如果我按照命令行执行以下操作:
Py -3 httpclient.py get -v "http://google.com" -h "key: value"
然而,正如你可以看到url位于-v之后,在任务中,它被要求放在最后,并且恰好是一个url。
所以我每次写作:
Py -3 httpclient.py get -v -h "key: value" "http://google.com"
我收到错误:
usage: httpclient.py [-v [V]] [-h [H]] [arg1] [arg2]
httpc.py: error: unrecognized arguments: http://google.com
那么如何将URL放在我的cmd行参数的末尾
答案 0 :(得分:1)
使用:
import argparse
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("arg1", nargs='?')
parser.add_argument("arg2", nargs='?')
parser.add_argument("-v", nargs='?')
parser.add_argument("-h", '--h', nargs='?', action='append')
args = parser.parse_args()
parser.print_help()
print(args)
测试运行:
1438:~/mypy$ python stack41863442.py
usage: stack41863442.py [-v [V]] [-h [H]] [arg1] [arg2]
positional arguments:
arg1
arg2
optional arguments:
-v [V]
-h [H], --h [H]
Namespace(arg1=None, arg2=None, h=None, v=None)
1526:~/mypy$ python stack41863442.py get -v -h "key: value"
....
Namespace(arg1='get', arg2=None, h=['key: value'], v=None)
1527:~/mypy$ python stack41863442.py get -v -h "key: value" google
usage: stack41863442.py [-v [V]] [-h [H]] [arg1] [arg2]
stack41863442.py: error: unrecognized arguments: google
在第一个作品之后放置第二个位置参数:
1528:~/mypy$ python stack41863442.py get google -v -h "key: value"
...
Namespace(arg1='get', arg2='google', h=['key: value'], v=None)
空列表满足nargs='?'
操作。因此,在arg2
之后立即解析arg1
,无需处理google
。
python stack41863442.py -v -h "key: value" get google
创建相同的命名空间。
小心多个变量nargs参数。他们并不总能很好地合作。
-v
如果给它const
和default
值,会更有用。例如还有postionals的默认值:
1536:~/mypy$ python stack41863442.py
Namespace(arg1='def1', arg2='def2', h=None, v='vdef')
1536:~/mypy$ python stack41863442.py -v
Namespace(arg1='def1', arg2='def2', h=None, v='vconst')
1536:~/mypy$ python stack41863442.py -v fpp
Namespace(arg1='def1', arg2='def2', h=None, v='fpp')
此处get
已分配给-v
:
1538:~/mypy$ python stack41863442.py -v get google
Namespace(arg1='google', arg2='def2', h=None, v='get')
对于verbosity
'切换',store_true
操作可能会更好。如果您想使用count
来表示额外的详细信息,也可以使用-vvv
操作。
我没有注意到-h
'追加',但我同意另一个答案。这是一个奇怪的组合。没有任何后续参数的-h
是什么意思?在此测试中,裸-h
将None
(默认)放在h
列表中。
1540:~/mypy$ python stack41863442.py -h test -h -h 'other;x'
Namespace(arg1='def1', arg2='def2', h=['test', None, 'other;x'], v='vdef')
答案 1 :(得分:1)
目前尚不清楚为什么使用nargs='?'
来表示-v
erbosity标志 - 你不应该期望任何值传递给它,更不用说多个值。
将nargs='?'
和action='append'
结合起来也很奇怪;你想让用户做吗结果-h one two
nargs='?'
(-h one -h two
)或action='append')
parsed_args.h == ['one', 'two']
?
或者,如果您想要-h
的内容是允许用户多次设置,每次都有一个单独的key
和value
,那么您想要的是:< / p>
parser.add_argument('-h', nargs=2, metavar=('key', 'value'), action='append')
采用两个可选参数后跟位置参数非常简单,并配置显示:
import argparse
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument('-v', action='store_true')
parser.add_argument('-h', metavar='key: value', action='append')
parser.add_argument('URL')
print(parser.parse_args())
获取你:
$ python test.py
usage: test.py [-v] [-h key: value] URL
test.py: error: too few arguments
$ python test.py -h one -h two three
Namespace(URL='three', h=['one', 'two'], v=False)
$ python test.py hello -v
Namespace(URL='hello', h=None, v=True)
要添加单独的get
和post
子命令,请查看使用add_subparsers
;这比仅允许用户提供随机输入并比较== 'get'
等
然而,目前还不清楚你真正想要的用户界面是什么,所以很难准确地说明你应该如何实现它。