为Python脚本编写帮助文档

38 投票
3 回答
48321 浏览
提问于 2025-04-17 11:14

我想让我的Python脚本更友好,所以我想写一些帮助说明。你有什么建议吗?我可以简单地加一些逻辑,比如如果用户在运行脚本时输入了“help”这个参数,就显示帮助信息。有没有什么好的做法或者约定呢?

3 个回答

1

除了内置的 argparse 之外,还有一个第三方的工具包叫做 Click。这个工具包的特点是可以“自动生成帮助页面”和“支持命令的任意嵌套”(这也会生成嵌套的帮助页面)。它的内部实现是基于 argparse 的,但我觉得用装饰器来创建复杂的命令行界面(CLI)会更加方便。

下面是一个示例代码:

import click

@click.command()
@click.argument("things", nargs=-1)
@click.option("-t", show_default=True, default="int", help="Data type")
@click.option("-o", help="Output format")
def combine(things, t):
    """Combines things into a single element"""
    pass

if __name__ == "__main__":
    combine()

生成的帮助页面如下:

$ python myapp.py --help
Usage: myapp.py [OPTIONS] [THINGS]...

  Combines things into a single element

Options:
  -t TEXT  Data type  [default: int]
  -o TEXT  Output format
  --help   Show this message and exit.

它的一个优点是可以把方法的文档字符串(docstrings)作为帮助页面的一部分,这样就方便了,因为文档字符串可以同时用于开发者文档和脚本使用帮助。

你还可以创建嵌套的命令组:

import click

@click.command()
@click.argument("numbers", nargs=-1)
@click.option("-e", help="Extra option for add")
def add(numbers, e):
    """Adds numbers"""
    print(f"This method should add {numbers}")

@click.command()
@click.argument("numbers", nargs=-1)
@click.option("-e", help="Extra option for mul")
def mul(numbers, e):
    """Multiplies numbers"""
    print(f"This method should multiply {numbers}")

@click.group()
def calc():
    pass

calc.add_command(add)
calc.add_command(mul)

if __name__ == "__main__":
    calc()

这样就会生成嵌套的帮助页面:

$ python myapp.py --help
Usage: myapp.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  add  Adds numbers
  mul  Multiplies numbers

$ python myapp.py add --help
Usage: myapp.py add [OPTIONS] [NUMBERS]...

  Adds numbers

Options:
  -e TEXT  Extra option for add
  --help   Show this message and exit.

$ python myapp.py mul --help
Usage: myapp.py mul [OPTIONS] [NUMBERS]...

  Multiplies numbers

Options:
  -e TEXT  Extra option for mul
  --help   Show this message and exit.

想了解更多信息,可以查看文档中的 文档脚本 部分。

12

最好的做法是使用 argparse 来处理你所有的命令行参数。它自带一个默认的 --help 选项,你可以根据自己的需要进行定制。

下面是一个最简单的例子:

import argparse

parser = argparse.ArgumentParser(description='This is my help')

args = parser.parse_args()

这会产生:

% python argparse_test.py -h
usage: argparse_test.py [-h]

This is my help

optional arguments:
  -h, --help  show this help message and exit

你可以用 argparse 定义所有的参数,并为每个参数设置帮助信息。最后,经过过滤和验证的参数会通过 parser.parse_args() 返回。

60

使用 argparse 这个库。

比如说,假设你有一个叫 test.py 的文件:

import argparse

parser=argparse.ArgumentParser(
    description='''My Description. And what a lovely description it is. ''',
    epilog="""All is well that ends well.""")
parser.add_argument('--foo', type=int, default=42, help='FOO!')
parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')
args=parser.parse_args()

运行这个文件

% test.py -h

会得到

usage: test.py [-h] [--foo FOO] [bar [bar ...]]

My Description. And what a lovely description it is.
    
positional arguments:
  bar         BAR!
    
optional arguments:
  -h, --help  show this help message and exit
  --foo FOO   FOO!
    
All is well that ends well.

撰写回答