我怎样才能有 python 中的用法
How can I have a Usage as follow in python
我想知道我怎么会有这样的用法:
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 行参数的末尾
与:
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)
A 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
'switch',store_true
操作可能更好。 count
如果您想使用 -vvv
表示额外的详细信息,也可以使用操作。
我没有注意到-h
'append',但我同意另一个答案。这是一个奇怪的组合。没有任何后续参数的 -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')
不清楚为什么要使用 nargs='?'
作为 -v
冗长标志 - 您不应该期望 any 值会为此传递,更不用说 多个 值了。
将nargs='?'
和action='append'
结合起来也很奇怪;你想让用户做,例如-h one two
(nargs='?'
) 或 -h one -h two
(action='append')
结果 parsed_args.h == ['one', 'two']
?
或者,如果您想要 -h
允许用户多次设置,每次使用单独的 key
和 value
,那么您想要的是:
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'
等
更有效
但是,您并不清楚您真正想要的用户界面是什么,因此很难准确地说出您应该如何实现它。
我想知道我怎么会有这样的用法:
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 行参数的末尾
与:
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)
A 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
'switch',store_true
操作可能更好。 count
如果您想使用 -vvv
表示额外的详细信息,也可以使用操作。
我没有注意到-h
'append',但我同意另一个答案。这是一个奇怪的组合。没有任何后续参数的 -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')
不清楚为什么要使用 nargs='?'
作为 -v
冗长标志 - 您不应该期望 any 值会为此传递,更不用说 多个 值了。
将nargs='?'
和action='append'
结合起来也很奇怪;你想让用户做,例如-h one two
(nargs='?'
) 或 -h one -h two
(action='append')
结果 parsed_args.h == ['one', 'two']
?
或者,如果您想要 -h
允许用户多次设置,每次使用单独的 key
和 value
,那么您想要的是:
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'
等
但是,您并不清楚您真正想要的用户界面是什么,因此很难准确地说出您应该如何实现它。