完全自定义的Python帮助用法

时间:2017-11-05 04:12:32

标签: python customization argparse

我正在尝试使用Python创建一个完全自定义的“帮助”用法(我打算将其导入到我希望具有样式一致性的许多程序中)但是我遇到了一些麻烦。

  1. 我不知道为什么我的描述会忽略换行符...... 试过“”和“”,
  2. 我不能在“... ARGS”行的/换行符之后出现“:”,显然他们看起来很奇怪,坐在他们自己的行上,
  3. 我不知道如何在最后添加换行符。请帮忙??
  4. 以下是我现在所得到的一个示例:

    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的新手。

1 个答案:

答案 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'

也就是说,我正在修改现有对象的属性。