跳转到主要内容

世界上最智能的命令行参数解析器

项目描述

Plac:以简单的方式解析命令行

plac 是一个Python包,可以从函数签名生成命令行参数。

plac 在Python 2.6到所有Python 3版本上都有效。

plac 不依赖于Python标准库之外的其他模块。

plac 的功能大部分都实现在一个单独的文件中,该文件可以包含在你的源代码中。

快速入门

plac 可以从函数签名自动生成命令行参数。

import plac

def main(model, iter=100, debug=False):
    """
    A script for machine learning
    """
    print (model, iter, debug)

if __name__ == '__main__':
    # Execute function via plac.call()
    plac.call(main)

上面的程序现在可以像这样从命令行接收参数

python example.py -d -i 1000 B

没有参数运行脚本 python example.py 会打印

usage: example.py [-h] [-i 100] [-d] {A,B,C}
example.py: error: the following arguments are required: model

此外,程序还可以生成帮助信息

python example.py -h

产生以下输出


usage: example.py [-h] model [iter] [debug]

A script for machine learning

positional arguments:
  model
  iter        [100]
  debug       [False]

options:
  -h, --help  show this help message and exit

当您需要更多控制时,plac提供了三个装饰器来描述位置、选项和标志类型参数

import plac

# Add decorators to the function
@plac.pos('model', help="model name", choices=['A', 'B', 'C'])
@plac.opt('iter', help="iterations", type=int)
@plac.flg('debug', help="debug mode")
def main(model, iter=100, debug=False):
    """
    A script for machine learning
    """
    print (model, iter, debug)

if __name__ == '__main__':
    # Execute function via plac.call().
    plac.call(main)

这将生成以下帮助信息

usage: example.py [-h] [-i 100] [-d] {A,B,C}

A script for machine learning

positional arguments:
  {A,B,C}             model name

options:
  -h, --help          show this help message and exit
  -i 100, --iter 100  iterations
  -d, --debug         debug mode

装饰器参考

要使用plac,您只需要了解以下三个装饰器

  • @plac.pos - 用于位置参数 model
  • @plac.opt - 用于键值选项 --iter 100
  • @plac.flg - 用于标志 --debug

它们具有以下签名

# Positional parameters.
pos(arg, help=None, type=None, choices=None, metavar=None):

# Option parameters.
opt(arg, help=None, type=None, abbrev=None, choices=None, metavar=None):

# Flag parameters.
flg(arg, help=None, abbrev=None):

零依赖项...甚至不是plac :-)

值得注意的是,plac的主要功能是在单个名为plac_core.py的Python模块中实现的,如果需要,可以将其包含并随源代码一起分发,从而减少代码中的外部依赖。

plac_core.py复制到您的包中,然后按如下方式使用它

from mypackage import plac_core as plac

避免名称冲突

Python语法或您的变量命名可能对可以作为参数使用的单词施加限制。为了绕过这种限制,请将尾随下划线添加到名称中。plac将从命令行参数名称中删除该下划线

import plac

@plac.flg('list_')   # avoid clash with builtin
@plac.flg('yield_')  # avoid clash with keyword
@plac.opt('sys_')    # avoid clash with a very common name
def main(list_, yield_=False, sys_=100):
    print(list_)
    print(yield_)
    print(sys_)

if __name__ == '__main__':
    plac.call(main)

产生以下用法

usage: example13.py [-h] [-l] [-y] [-s 100]

optional arguments:
  -h, --help         show this help message and exit
  -l, --list
  -y, --yield        [False]
  -s 100, --sys 100  [100]

可变参数

plac可以接受多个位置参数,甚至还可以接受额外的键=值对

import plac

@plac.pos('args', help="words")
@plac.opt('kwds', help="key=value", )
def main(*args, **kwds):
    print(args)
    print(kwds)

if __name__ == '__main__':
    plac.call(main)

用法将是

usage: example15.py [-h] [args ...] [kwds ...]

positional arguments:
  args        words
  kwds        key=value

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

当以以下方式运行时

python example15.py A B x=10 y=20

程序将打印

('A', 'B')
{'x': '10', 'y': '20'}

安装

pip install plac

测试

运行

python doc/test_plac.py

您将看到几个明显的错误,但这是对的,因为测试正在检查几个错误条件。重要的是您能获得以下类似的行

执行XX测试OK

代码

作者:Michele Simionato,michele.simionato@gmail.com

维护者:Istvan Albert,istvan.albert@gmail.com

问题

许可证

BSD许可

支持者