PySide6.QtCore.QCommandLineParser

class QCommandLineParser

QCommandLineParser 类提供了一种处理命令行选项的方法。更多

概要

方法

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。

详细描述

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

QCoreApplication 提供了命令行参数作为一个简单的字符串列表。QCommandLineParser 提供了定义一组选项、解析命令行参数以及存储实际使用的选项及其值的能力。

任何不是选项的参数(即不以-开头的参数)都被存储为“位置参数”。

解析器处理短名称、长名称、同一选项的多个名称以及选项值。

命令行上的选项被识别为以一个或两个-字符开头,后跟选项名称。选项-(单独的单破折号)是一个特殊情况,通常表示标准输入,并且不被视为选项。解析器将把选项--(双破折号)之后的所有内容视为位置参数。

短选项是单个字母。选项 v 可以通过在命令行中传递 -v 来指定。在默认的解析模式下,短选项可以以紧凑的形式书写,例如 -abc 等同于 -a -b -c。解析模式可以更改为 ParseAsLongOptions,在这种情况下,-abc 将被解析为长选项 abc

长选项超过一个字母长度,不能紧凑地组合在一起。长选项 verbose 将作为 --verbose-verbose 传递。

可以通过使用赋值运算符(-v=value, --verbose=value)或使用空格(-v value, --verbose value)来传递值给选项。即使值以-开头,这种方法也有效。

解析器不支持可选值 - 如果某个选项被设置为需要值,则必须提供一个值。如果这样的选项放在最后并且没有值,则该选项将被视为未指定。

解析器不会自动支持通过使用格式--disable-option--no-option来否定或禁用长选项。然而,可以通过显式地处理这种情况,将no-option作为其名称之一,并显式地处理该选项。

示例:

if __name__ == "__main__":

    app = QCoreApplication(argc, argv)
    QCoreApplication.setApplicationName("my-copy-program")
    QCoreApplication.setApplicationVersion("1.0")
    parser = QCommandLineParser()
    parser.setApplicationDescription("Test helper")
    parser.addHelpOption()
    parser.addVersionOption()
    parser.addPositionalArgument("source", QCoreApplication.translate("main", "Source file to copy."))
    parser.addPositionalArgument("destination", QCoreApplication.translate("main", "Destination directory."))
    # A boolean option with a single name (-p)
    showProgressOption = QCommandLineOption("p", QCoreApplication.translate("main", "Show progress during copy"))
    parser.addOption(showProgressOption)
    # A boolean option with multiple names (-f, --force)
    QCommandLineOption forceOption(QStringList() << "f" << "force",
            QCoreApplication.translate("main", "Overwrite existing files."))
    parser.addOption(forceOption)
    # An option with a value
    QCommandLineOption targetDirectoryOption(QStringList() << "t" << "target-directory",
            QCoreApplication.translate("main", "Copy all source files into <directory>."),
            QCoreApplication.translate("main", "directory"))
    parser.addOption(targetDirectoryOption)
    # Process the actual command line arguments given by the user
    parser.process(app)
    args = parser.positionalArguments()
    # source is args.at(0), destination is args.at(1)
    showProgress = parser.isSet(showProgressOption)
    force = parser.isSet(forceOption)
    targetDir = parser.value(targetDirectoryOption)
    # ...

在上面的示例中,三个addOption()调用可以通过使用addOptions()来变得更简洁:

parser.addOptions({
    # A boolean option with a single name (-p)
    {"p",
        QCoreApplication.translate("main", "Show progress during copy")},
    # A boolean option with multiple names (-f, --force)
    {{"f", "force"},
        QCoreApplication.translate("main", "Overwrite existing files.")},
    # An option with a value
    {{"t", "target-directory"},
        QCoreApplication.translate("main", "Copy all source files into <directory>."),
        QCoreApplication.translate("main", "directory")},
})

已知限制:在QCoreApplication及其子类中解析Qt选项发生在QCommandLineParser存在之前,因此无法考虑它。这意味着任何看起来像内置Qt选项的选项值将被QCoreApplication视为内置Qt选项。例如:--profile -reverse将导致QGuiApplication看到-reverse选项设置,并在QCommandLineParser定义profile选项并解析命令行之前将其从arguments()中移除。

如何在复杂应用程序中使用QCommandLineParser

在实践中,需要对位置参数和选项值进行额外的错误检查。例如,应检查数字的范围。

建议引入一个函数来处理命令行解析,该函数接收一个结构体或类来接收选项值,并返回一个表示结果的对象。QtNetwork模块的dnslookup示例说明了这一点:

class DnsQuery():

    DnsQuery() : type(QDnsLookup.A) {}
    QDnsLookup.Type type
    nameServer = QHostAddress()
    name = QString()
class CommandLineParseResult():

    enum class Status {
        Ok,
        Error,
        VersionRequested,
        HelpRequested

    statusCode = Status::Ok()
    std.optional<QString> errorString = std.nullopt

def parseCommandLine(parser,query):

    Status = CommandLineParseResult::Status()
    parser.setSingleDashWordOptionMode(QCommandLineParser.ParseAsLongOptions)
    nameServerOption = QCommandLineOption("n", "The name server to use.", "nameserver")
    parser.addOption(nameServerOption)
    typeOption = QCommandLineOption("t", "The lookup type.", "type")
    parser.addOption(typeOption)
    parser.addPositionalArgument("name", "The name to look up.")
    helpOption = parser.addHelpOption()
    versionOption = parser.addVersionOption()
    if not parser.parse(QCoreApplication.arguments()):
        return { Status.Error, parser.errorText() }
    if parser.isSet(versionOption):
        return { Status.VersionRequested }
    if parser.isSet(helpOption):
        return { Status.HelpRequested }
    if parser.isSet(nameServerOption):
        nameserver = parser.value(nameServerOption)
        query.nameServer = QHostAddress(nameserver)
        if (query.nameServer.isNull()
            or query.nameServer.protocol() == QAbstractSocket.UnknownNetworkLayerProtocol) {
            return { Status.Error,
                     "Bad nameserver address: %1".arg(nameserver) }


    if parser.isSet(typeOption):
        typeParameter = parser.value(typeOption)
        if std.optional<QDnsLookup.Type> type = typeFromParameter(typeParameter):
            query.type = type
else:
            return { Status.Error, "Bad record type: %1".arg(typeParameter) }

    positionalArguments = parser.positionalArguments()
    if positionalArguments.isEmpty():
        return { Status.Error, "Argument 'name' missing." }
    if positionalArguments.size() > 1:
        return { Status.Error, "Several 'name' arguments specified." }
    query.name = positionalArguments.first()
    return { Status.Ok }

在主函数中,如果传递了帮助选项,则应将帮助信息打印到标准输出,并且应用程序应返回退出代码0。

如果检测到错误,应将错误消息打印到标准错误输出,并且应用程序应返回非0的退出代码。

QCoreApplication.setApplicationVersion(QT_VERSION_STR)
QCoreApplication.setApplicationName(QCoreApplication.translate("QDnsLookupExample",
                                                                 "DNS Lookup Example"))
parser = QCommandLineParser()
parser.setApplicationDescription(QCoreApplication.translate("QDnsLookupExample",
                                                             "An example demonstrating the "
                                                             "class QDnsLookup."))
query = DnsQuery()
Status = CommandLineParseResult::Status()
parseResult = parseCommandLine(parser, query)

if parseResult.statusCode == Status.Ok:
    break
elif parseResult.statusCode == Status.Error:
    std::fputs(qPrintable(parseResult.errorString.value_or("Unknown error occurred")),
               stderr)
    std::fputs("\n\n", stderr)
    std::fputs(qPrintable(parser.helpText()), stderr)
    return 1
elif parseResult.statusCode == Status.VersionRequested:
    parser.showVersion()
    Q_UNREACHABLE_RETURN(0)
elif parseResult.statusCode == Status.HelpRequested:
    parser.showHelp()
    Q_UNREACHABLE_RETURN(0)

这里需要考虑的一个特殊情况是Windows和移动平台上的GUI应用程序。这些应用程序可能不使用标准输出或错误通道,因为输出要么被丢弃,要么无法访问。

在Windows上,如果无法获取控制台窗口,QCommandLineParser 会使用消息框来显示使用信息和错误。可以通过设置 QT_COMMAND_LINE_PARSER_NO_GUI_MESSAGE_BOXES 环境变量来省略这些消息框。

对于其他平台,建议使用QMessageBox显示帮助文本和错误消息。为了保留帮助文本的格式,应使用带有

元素的富文本:

switch (parseResult.statusCode) {
case Status::Ok:
    break;
case Status::Error: {
    QString errorMessage = parseResult.errorString.value_or(u"Unknown error occurred"_qs);
    QMessageBox::warning(0, QGuiApplication::applicationDisplayName(),
                         "<html><head/><body><h2>" + errorMessage + "</h2><pre>"
                         + parser.helpText() + "</pre></body></html>");
    return 1;
}
case Status::VersionRequested:
    QMessageBox::information(0, QGuiApplication::applicationDisplayName(),
                             QGuiApplication::applicationDisplayName() + ' '
                             + QCoreApplication::applicationVersion());
    return 0;
case Status::HelpRequested:
    QMessageBox::warning(0, QGuiApplication::applicationDisplayName(),
                         "<html><head/><body><pre>"
                         + parser.helpText() + "</pre></body></html>");
    return 0;
}

然而,这不适用于dnslookup示例,因为它是一个控制台应用程序。

class SingleDashWordOptionMode

此枚举描述了解析器解释使用单个破折号后跟多个字母的命令行选项的方式,如-abc

常量

描述

QCommandLineParser.ParseAsCompactedShortOptions

-abc 被解释为 -a -b -c,即三个在命令行上被压缩的短选项,如果这些选项都不带值。如果 a 带有一个值,那么它被解释为 -a bc,即短选项 a 后跟值 bc。这通常用于行为类似于编译器的工具中,以处理诸如 -DDEFINE=VALUE-I/include/path 的选项。这是默认的解析模式。建议新应用程序使用此模式。

QCommandLineParser.ParseAsLongOptions

-abc 被解释为 --abc,即名为 abc 的长选项。这是 Qt 自己的工具(uic, rcc…)一直以来解析参数的方式。这种模式应该用于保持应用程序的兼容性,这些应用程序以前以这种方式解析参数。如果 a 选项设置了 ShortOptionStyle 标志,则有一个例外,在这种情况下,它仍然被解释为 -a bc

class OptionsAfterPositionalArgumentsMode

此枚举描述了解析器解释出现在位置参数之后的选项的方式。

常量

描述

QCommandLineParser.ParseAsOptions

application argument --opt -t 被解释为设置选项 optt,就像 application --opt -t argument 所做的那样。这是默认的解析模式。为了指定 --opt-t 是位置参数,用户可以使用 --,如 application argument -- --opt -t

QCommandLineParser.ParseAsPositionalArguments

application argument --opt 被解释为具有两个位置参数,argument--opt。此模式对于旨在启动其他可执行文件(例如包装器、调试工具等)或支持内部命令后跟命令选项的可执行文件非常有用。argument 是命令的名称,其后出现的所有选项都可以由另一个命令行解析器收集和解析,可能是在另一个可执行文件中。

__init__()

构建一个命令行解析器对象。

addHelpOption()
Return type:

QCommandLineOption

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

向命令行解析器添加帮助选项。

此命令行指定的选项由-h--help描述。在Windows上,还支持替代选项-?。选项--help-all扩展了输出,以包括未由此命令定义的通用Qt选项。

这些选项由QCommandLineParser自动处理。

记得使用 setApplicationDescription() 来设置应用程序描述,当使用此选项时将显示该描述。

示例:

if __name__ == "__main__":

    app = QCoreApplication(argc, argv)
    QCoreApplication.setApplicationName("my-copy-program")
    QCoreApplication.setApplicationVersion("1.0")
    parser = QCommandLineParser()
    parser.setApplicationDescription("Test helper")
    parser.addHelpOption()
    parser.addVersionOption()
    parser.addPositionalArgument("source", QCoreApplication.translate("main", "Source file to copy."))
    parser.addPositionalArgument("destination", QCoreApplication.translate("main", "Destination directory."))
    # A boolean option with a single name (-p)
    showProgressOption = QCommandLineOption("p", QCoreApplication.translate("main", "Show progress during copy"))
    parser.addOption(showProgressOption)
    # A boolean option with multiple names (-f, --force)
    QCommandLineOption forceOption(QStringList() << "f" << "force",
            QCoreApplication.translate("main", "Overwrite existing files."))
    parser.addOption(forceOption)
    # An option with a value
    QCommandLineOption targetDirectoryOption(QStringList() << "t" << "target-directory",
            QCoreApplication.translate("main", "Copy all source files into <directory>."),
            QCoreApplication.translate("main", "directory"))
    parser.addOption(targetDirectoryOption)
    # Process the actual command line arguments given by the user
    parser.process(app)
    args = parser.positionalArguments()
    # source is args.at(0), destination is args.at(1)
    showProgress = parser.isSet(showProgressOption)
    force = parser.isSet(forceOption)
    targetDir = parser.value(targetDirectoryOption)
    # ...

返回选项实例,可用于调用 isSet()

addOption(commandLineOption)
Parameters:

commandLineOptionQCommandLineOption

Return type:

布尔

添加解析时要查找的选项 option

如果添加选项成功,则返回 true;否则返回 false

如果没有为选项附加名称,或者选项的名称与之前添加的选项名称冲突,则添加选项将失败。

addOptions(options)
Parameters:

options – QCommandLineOption 的列表

Return type:

布尔

添加解析时要查找的选项。这些选项由参数options指定。

如果添加所有选项成功,则返回 true;否则返回 false

请参阅addOption()的文档,了解此函数何时可能失败。

addPositionalArgument(name, description[, syntax=""])
Parameters:
  • name – str

  • 描述 – str

  • 语法 – str

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

为应用程序定义一个额外的参数,以便于帮助文本的生成。

参数 namedescription 将出现在帮助的 Arguments: 部分。如果指定了 syntax,它将被附加到用法行,否则将附加 name

示例:

# Usage: image-editor file
#
# Arguments:
#   file                  The file to open.
parser.addPositionalArgument("file", QCoreApplication.translate("main", "The file to open."))
# Usage: web-browser [urls...]
#
# Arguments:
#   urls                URLs to open, optionally.
parser.addPositionalArgument("urls", QCoreApplication.translate("main", "URLs to open, optionally."), "[urls...]")
# Usage: cp source destination
#
# Arguments:
#   source                Source file to copy.
#   destination           Destination directory.
parser.addPositionalArgument("source", QCoreApplication.translate("main", "Source file to copy."))
parser.addPositionalArgument("destination", QCoreApplication.translate("main", "Destination directory."))
addVersionOption()
Return type:

QCommandLineOption

添加了-v / --version选项,该选项显示应用程序的版本字符串。

此选项由QCommandLineParser自动处理。

您可以使用setApplicationVersion()来设置实际的版本字符串。

返回选项实例,可用于调用 isSet()

applicationDescription()
Return type:

字符串

返回在setApplicationDescription()中设置的应用程序描述。

clearPositionalArguments()

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

清除帮助文本中额外参数的定义。

这仅适用于支持具有不同选项的多个命令的特殊情况下的工具。一旦确定了实际命令,就可以定义该命令的选项,并相应地调整该命令的帮助文本。

示例:

app = QCoreApplication(argc, argv)
parser = QCommandLineParser()
parser.addPositionalArgument("command", "The command to execute.")
# Call parse() to find out the positional arguments.
parser.parse(QCoreApplication.arguments())
args = parser.positionalArguments()
command = args.isEmpty() if QString() else args.first()
if command == "resize":
    parser.clearPositionalArguments()
    parser.addPositionalArgument("resize", "Resize the object to a size().", "resize [resize_options]")
    parser.addOption(QCommandLineOption("size", "New size.", "new_size"))
    parser.process(app)
    # ...

/*
This code results in context-dependent help:
$ tool --help
Usage: tool command
Arguments:
  command The command to execute.
$ tool resize --help
Usage: tool resize [resize_options]
Options:
  size <size> New size. -= 1
Arguments:
  resize Resize the object to a size().
*/
errorText()
Return type:

字符串

返回给用户的翻译错误文本。这应该仅在parse()返回false时调用。

helpText()
Return type:

字符串

返回包含完整帮助信息的字符串。

另请参阅

showHelp()

isSet(option)
Parameters:

选项QCommandLineOption

Return type:

布尔

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

这是一个重载函数。

检查是否将option传递给应用程序。

如果设置了option,则返回true,否则返回false。

这是检查没有值的选项的推荐方法。

示例:

app = QCoreApplication(argc, argv)
parser = QCommandLineParser()
verboseOption = QCommandLineOption("verbose")
parser.addOption(verboseOption)
parser.process(app)
verbose = parser.isSet(verboseOption)
isSet(name)
Parameters:

name – str

Return type:

布尔

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

检查选项name是否已传递给应用程序。

如果选项 name 被设置,则返回 true,否则返回 false。

提供的名称可以是使用addOption()添加的任何选项的长名称或短名称。所有选项名称都被视为等效。如果名称未被识别或该选项不存在,则返回false。

示例:

verbose = parser.isSet("verbose")
optionNames()
Return type:

字符串列表

返回找到的选项名称列表。

这将返回解析器发现的所有已识别选项名称的列表,按照它们被发现的顺序。对于任何形式为{–option=value}的长选项,值部分将被丢弃。

此列表中的名称不包括前面的破折号字符。如果解析器多次遇到名称,则名称可能会在此列表中多次出现。

列表中的任何条目都可以与value()values()一起使用,以获取任何相关的选项值。

parse(arguments)
Parameters:

arguments – 字符串列表

Return type:

布尔

解析命令行 arguments

大多数程序不需要调用这个,简单地调用process()就足够了。

parse() 是更低级别的,只负责解析。应用程序需要自行处理错误处理,如果 parse() 返回 false,则使用 errorText()。这在图形程序中显示图形错误消息时非常有用。

调用 parse() 而不是 process() 也可能有用,以便暂时忽略未知选项,因为在调用 process() 之前,将根据其中一个参数提供更多的选项定义。

不要忘记arguments必须以可执行文件的名称开头(尽管会被忽略)。

在解析错误(未知选项或缺少值)的情况下返回false;否则返回true

另请参阅

process()

positionalArguments()
Return type:

字符串列表

返回一个位置参数的列表。

这些都是未被识别为选项一部分的参数。

process(app)
Parameters:

appQCoreApplication

这是一个重载函数。

命令行是从QCoreApplication实例app中获取的。

process(arguments)
Parameters:

arguments – 字符串列表

处理命令行arguments

除了解析选项(如parse()),此函数还处理内置选项并处理错误。

内置选项包括 --version(如果调用了 addVersionOption)以及 --help / --help-all(如果调用了 addHelpOption)。

当调用这些选项之一时,或者发生错误时(例如传递了未知选项),当前进程将使用exit()函数停止。

另请参阅

arguments() parse()

setApplicationDescription(description)
Parameters:

描述 – str

设置由helpText()显示的应用程序description

setOptionsAfterPositionalArgumentsMode(mode)
Parameters:

modeOptionsAfterPositionalArgumentsMode

将解析模式设置为parsingMode。这必须在调用process()parse()之前完成。

setSingleDashWordOptionMode(parsingMode)
Parameters:

parsingModeSingleDashWordOptionMode

将解析模式设置为singleDashWordOptionMode。这必须在调用process()parse()之前完成。

showHelp([exitCode=0])
Parameters:

exitCode – int

显示帮助信息,并退出应用程序。这通常由–help选项自动触发,但也可以在用户未正确调用应用程序时用于显示帮助。退出代码设置为exitCode。如果用户请求查看帮助,则应将其设置为0,如果出现错误,则应设置为其他值。

另请参阅

helpText()

showVersion()

显示来自applicationVersion()的版本信息,并退出应用程序。这通常由–version选项自动触发,但也可以在不使用process()时用于显示版本。退出代码设置为EXIT_SUCCESS(0)。

另请参阅

addVersionOption()

unknownOptionNames()
Return type:

字符串列表

返回未知选项名称的列表。

此列表将包括未被识别的长名称和短名称选项。对于任何以{–option=value}形式的长选项,值部分将被丢弃,仅添加长名称。

此列表中的名称不包括前面的破折号字符。如果解析器多次遇到名称,则名称可能会在此列表中多次出现。

另请参阅

optionNames()

value(option)
Parameters:

选项QCommandLineOption

Return type:

字符串

这是一个重载函数。

返回找到的给定option的选项值,如果未找到则返回空字符串。

对于解析器找到的选项,返回该选项的最后一个值。如果命令行中未指定该选项,则返回默认值。

如果选项没有取值,则返回一个空字符串。

value(name)
Parameters:

name – str

Return type:

字符串

返回给定选项名称 optionName 找到的选项值,如果未找到则返回空字符串。

提供的名称可以是使用addOption()添加的任何选项的长名称或短名称。所有选项名称都被视为等效。如果名称未被识别或该选项不存在,则返回空字符串。

对于解析器找到的选项,返回该选项的最后一个值。如果未在命令行上指定该选项,则返回默认值。

如果选项没有取值,将打印警告,并返回一个空字符串。

values(option)
Parameters:

选项QCommandLineOption

Return type:

字符串列表

这是一个重载函数。

返回为给定option找到的选项值列表,如果未找到则返回空列表。

对于解析器找到的选项,列表将包含解析器每次遇到该选项时的条目。如果未在命令行上指定该选项,则返回默认值。

如果选项没有取值,则返回一个空列表。

values(name)
Parameters:

name – str

Return type:

字符串列表

返回给定选项名称 optionName 找到的选项值列表,如果未找到则返回空列表。

提供的名称可以是使用addOption()添加的任何选项的长名称或短名称。所有选项名称都被视为等效。如果名称未被识别或该选项不存在,则返回一个空列表。

对于解析器找到的选项,列表将包含解析器每次遇到该选项的条目。如果未在命令行上指定该选项,则返回默认值。

如果选项没有取值,则返回一个空列表。