首页 > 解决方案 > 帮助文本中的 Python argparse 参数顺序

问题描述

我的 Python 程序使用 argparse 模块接受命令行参数,它按预期工作,但是,帮助文本有点误导,我想使用我的程序为其他人修复它。

目前,我有一个位置参数,它是一个目录和一个可选参数,它使用函数的参数-p接受任意数量的包名称。DIR 位置参数需要在可选参数列表之前指定,否则该目录将被错误地添加到包名称列表中,并且会出错说没有指定位置参数。帮助输出当前如下所示:nargs=+add_argument

package_info.py --help
usage: package_info.py [-h] [-v] [--no-cache] [-g FILE] [-p [PKG [PKG ...]]]
                       DIR

Get information on packages in ros workspace.

positional arguments:
  DIR                   The directory containing rospackages.

optional arguments:
  -h, --help            show this help message and exit
  -v, --verbose         Enables verbose mode
  --no-cache            Do not cache the dependency graph
  -g FILE, --graph-file FILE
                        The graph file to load from or save to.
  -p [PKG [PKG ...]], --packages [PKG [PKG ...]]
                        The packages to provide information on.

我希望将其格式化为在 -p 标志之前显示 DIR,以便用户更清楚地知道必须首先指定此参数,如下所示:

package_info.py --help
usage: package_info.py DIR [-h] [-v] [--no-cache] [-g FILE] [-p [PKG [PKG ...]]]
            .
            .
            .

或者

package_info.py --help
usage: package_info.py DIR
                       [-h] [-v] [--no-cache] [-g FILE] [-p [PKG [PKG ...]]]
            .
            .
            .

是否有一种简单的方法来格式化帮助消息,或者我需要编写自定义帮助消息格式化程序?

标签: pythonparameter-passingcommand-line-argumentsargparse

解决方案


你说的是usage线路。

使用格式化程序确实将它们分开positionals并将它们放在最后,如果足够长的话,可能会放在它们自己的行上。是的,确实与处理“+”标记的参数有冲突。它不应该,但是修复太复杂了,不能简单地插入。

我不建议更改使用格式化程序 - 这组方法太复杂(且脆弱)而不能成为一个简单的补丁。

在定义时提供自定义usage参数ArgumentParser将是最简单的解决方法。我不记得它是如何与换行交互的。


推荐阅读