我正在尝试使用Python创建一个完全自定义的“帮助”用法(我打算将其导入到我希望具有样式一致性的许多程序中)但是我遇到了一些麻烦。
以下是我现在所得到的一个示例:
nameconstant version 1.0
USAGE: myprog.py [constant text] <input.ext> <input.ext>
several lines of text describing my program.. because it will be necessary
___________________
COMPULSORY ARGS:
input.ext
output.ext
___________________
OPTIONAL ARGS:
-v, --verbose print debugging messages to terminal
-h, --help
这就是我想要的样子:
nameconstant version 1.0
USAGE: myprog.py [constant text] <input.ext> <input.ext>
several lines of text
describing my program..
because it will be necessary
___________________
COMPULSORY ARGS:
input.ext
output.ext
___________________
OPTIONAL ARGS:
-v, --verbose print debugging messages to terminal
-h, --help
\n - not visible!
这是我到目前为止所使用的代码:
#!/usr/bin/env python
import argparse
import sys
from os import path
version = "1.0"
prog = path.basename(sys.argv[0])
class USAGEformat(argparse.HelpFormatter):
def add_usage(self, usage, actions, groups, prefix=None):
if prefix is None:
prefix = 'nameconstant version '+ version+'\n\nUSAGE: '+prog
return super(USAGEformat, self).add_usage(
usage, actions, groups, prefix)
parser = argparse.ArgumentParser(add_help=False, formatter_class=USAGEformat, description='several lines of text\ndescribing my program..\n\nb
ecause it will be necessary', usage=' [optional args] <INPUT.ext> <OUTPUT.ext>')
parser._positionals.title = '___________________\nCOMPULSORY ARGS'
parser._optionals.title = '___________________\nOPTIONAL ARGS'
parser.add_argument('input', metavar="input.ext", type=argparse.FileType('rt'))
parser.add_argument('output', metavar="output.ext", type=argparse.FileType('wt'))
parser.add_argument('-v', '--verbose', action='store_true', default=False, help='print debugging messages to terminal')
parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS)
我应该采取哪些不同的做法或进行下一步?谢谢!非常感谢任何帮助..我是Python的新手。
答案 0 :(得分:0)
import argparse
version = "1.0"
class USAGEformat(argparse.RawDescriptionHelpFormatter):
def add_usage(self, usage, actions, groups, prefix=None):
if prefix is None:
prefix = 'nameconstant version '+ version+' USAGE: '
return super(USAGEformat, self).add_usage(
usage, actions, groups, prefix)
parser = argparse.ArgumentParser(add_help=False, formatter_class=USAGEformat,
description=\
'''several lines of text
describing my program..
because it will be necessary''')
gp1 = parser.add_argument_group('___________________\nCOMPULSORY ARGS')
gp1.add_argument('input', metavar="input.ext", type=argparse.FileType('rt'))
gp1.add_argument('output', metavar="output.ext", type=argparse.FileType('wt'))
gp2 = parser.add_argument_group('___________________\nOPTIONAL ARGS')
gp2.add_argument('-v', '--verbose', action='store_true', default=False,
help='print debugging messages to terminal')
gp2.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS)
parser.print_help()
产生
2156:~/mypy$ python stack47118098.py
nameconstant version 1.0 USAGE: stack47118098.py [-v] [-h]
input.ext output.ext
several lines of text
describing my program..
because it will be necessary
___________________
COMPULSORY ARGS:
input.ext
output.ext
___________________
OPTIONAL ARGS:
-v, --verbose print debugging messages to terminal
-h, --help
RawDescriptionHelpFormatter
保留说明的格式。
我使用'''...'''
作为描述只是为了让代码看起来更好;那不重要。
我将argument_groups
替换为您现有组的重命名。你的方式很好,但我认为我的是开发人员想要的。
HelpFormatter
格式化各个部分,在它们之间慷慨地使用\n
,然后最终剥离重复(包括结尾)。因此,我们必须确定并修改相关方法(format_help
)。
自从我开始回答以来,您已对usage
行进行了一些更改。
我同意这样的评论,即按照惯例,在没有[]
的情况下显示所需的参数。
我得到了这种用法,因为带前缀的行太长了。因此它将它拆分,并将位置放在第二行,与选项一起排列:
nameconstant version 1.0 USAGE: stack47118098.py [-v] [-h]
input.ext output.ext
如果我设置
prefix = 'USAGE: '
然后使用
USAGE: stack47118098.py [-v] [-h] input.ext output.ext
我们必须查看它如何包装和缩进以获得您的规格使用。
在importing custom python modules.. why do only some elements carry over?
中我解释说每次请求帮助或使用时都会创建新的帮助格式化程序。定义parser
设置格式化程序类,但不创建格式化程序。这意味着格式化程序类使用的任何全局变量都将其值作为运行时而不是设置。
例如,version
是全局的(对于模块)。它最初为“1.0”,这是使用中显示的值。但是如果我添加到上面脚本的末尾:
version = '2.0'
parser.print_help()
使用行更改为:
nameconstant version 2.0 USAGE: stack47118098.py [-v] [-h]
input.ext output.ext
如果我用以下内容导入此脚本:
import stack47118098 as pp
print('===========')
print(pp.version)
print(pp.parser)
pp.parser.print_help()
pp.version = '3.0'
pp.parser.print_help()
第一个帮助(导入后)使用文件中的“2.0”版本。但第二个帮助使用新定义的version
。
要更改解析器的description
之类的内容,我必须使用
pp.parser.description = 'New short description'
也就是说,我正在修改现有对象的属性。