cli脚本的简单样板

fissle的Python项目详细描述


fissle-快速命令行界面

创建处理加载配置的半自文档化命令行界面 除了命令行参数之外,文件和启用env变量重载 通过使用"业务逻辑"定义配置的简单模式和类。

示例:这是准备好配置和命令行界面所需的最低设置:

from fissle import c, NamedTuple

@c
class C(NamedTuple):
   a: int = 1
 
@c
class Cli:
    def foo(self):
        # using configuration
        print(c.a)

换句话说,使用此命令将脚本包装为命令行命令 忙于和维护参数解析和复制注释以获得帮助或记忆 争论是什么和做了什么 同时仍然具有典型的cli程序使用经验(例如--help,subcommands,…)。 这个实现的前提是,对于一个简单的脚本,您有一个全局配置 将通过用户代码使用,即程序的上下文。这种配置 填充了返回的给定参数 代码中的默认值和其他一些免费选项。

适用于Linux、MacOS和Windows。

安装

pip install --user fissle

请参见自述文件末尾的其他选项

用法

请参阅tester/\u main\py中的示例文件。这是个人的详细资料 零件在其中。

首先导入所需的组件:

from fissle import c, NamedTuple

在代码中,将模式定义为用c

@c
class Configuration(NamedTuple):
    a: str = 'A'  # a description
    x: int = 1  # x description

"配置"是一个任意的名字,没有魔力。继承的namedtuple 将模式的模板化简化为仅定义其中的属性(即ax) 例子)。它们有固定的方式:

    # attribute: type = default value  # Description for the --help
    a: str = 'A'  # a description

a是一个属性,以后可以用c.a在代码中调用它。它有一个'str'类型,默认值 "a"的值。为命令行解析后的注释,因此它不多余。所有这些 部分将被解析为cli子命令的"--help",其定义如下:

@c
class Cli:
    def subcommand_foo(self):
        """This will be shown in --help for subcommand-foo"""
        print('foo')
        print(c.a)
        print(c.x)

    def subcommand_bar(self):
        """This will be shown in --help for subcommand-bar"""
        print('bar')

这些方法被解析为cli的子命令,它们各自的文档字符串将显示在 子命令的帮助打印出来。注意解析配置的用法c

print(c.a)
print(c.x)

此外,要在IDE中启用自动完成功能,暂时需要进行以下操作:

c: Configuration = c

把它放在"全局空间"中,例如在定义模板之后。有关特定示例,请参见检测仪/uu main\uuu.py

全部完成后,导入的c变量应具有配置的所有位和块。它可以 在cli类中使用,并围绕代码库导入,因此将所有配置封装到一个 具有属性c.ac.x等快速访问的容器。

运行cli

# Test the damage (presuming you did the flit step below)
tester -- -h
tester subcommand-foo -- -h
tester subcommand-bar

输出应该与此类似(fire v0.1.3打印出参数,firev0.2.1没有(虽然看起来更好))

from fissle import c, NamedTuple

@c
class C(NamedTuple):
   a: int = 1
 
@c
class Cli:
    def foo(self):
        # using configuration
        print(c.a)
0

配置文件和环境变量

cdecorator/configuration按优先级顺序将多个配置选项链接在一起(数字越低,数字越高):

  1. 命令行参数
  2. 环境变量
  3. 配置文件定义
  4. schema/template/namedtuple类中的默认值

配置文件应使用postfix.cfg命名,例如foo.cfg并使用 "默认"部分:

from fissle import c, NamedTuple

@c
class C(NamedTuple):
   a: int = 1
 
@c
class Cli:
    def foo(self):
        # using configuration
        print(c.a)
1

这些键与您在模式中定义的键相同。您可以定义全部、部分或全部属性。 对env变量同样适用。

from fissle import c, NamedTuple

@c
class C(NamedTuple):
   a: int = 1
 
@c
class Cli:
    def foo(self):
        # using configuration
        print(c.a)
2

作为命令行程序安装,即命令

from fissle import c, NamedTuple

@c
class C(NamedTuple):
   a: int = 1
 
@c
class Cli:
    def foo(self):
        # using configuration
        print(c.a)
3

通过Fire提供现成的功能

请参阅python fire的标志 nice广告文档其他功能,如:

from fissle import c, NamedTuple

@c
class C(NamedTuple):
   a: int = 1
 
@c
class Cli:
    def foo(self):
        # using configuration
        print(c.a)
4

为什么选择另一个cli框架?

这只是一个用python编写cli程序的工具,因此您不必使用bash。目的是 让一些合理配置和通用的东西尽快启动和运行。我懒得背了 argparses语法,尽管它是一个非常好的包。另外,点击可以得到更精细的东西,尽管火是 我的个人最爱。

从源安装

注意: 如果您喜欢其他工具,可以试试deshell 将其从pipenv转换为requirements.txt等。(或是什么让你漂浮在船上)

pipenv

from fissle import c, NamedTuple

@c
class C(NamedTuple):
   a: int = 1
 
@c
class Cli:
    def foo(self):
        # using configuration
        print(c.a)
5

PIPENV环境

from fissle import c, NamedTuple

@c
class C(NamedTuple):
   a: int = 1
 
@c
class Cli:
    def foo(self):
        # using configuration
        print(c.a)
6

注意:连续的步骤假定pipenv环境 已使用/已激活

依赖关系

完成时间:

  • 在帮助中显示参数/如何以编程方式将namedtuple的签名传递给cli函数?
    • 需要进行代码生成,即将签名写入一个单独的python文件并评估它?
    • 有什么特殊的消防技巧吗?cli(c)定义不起作用。
      • 可能覆盖"usage"部分或生成docstring
    • 创建一个伴生类,该类描述namedtuple字段的函数
    • 硬编码默认机制
  • 配置分析器
  • decorator或其他一些包装器,用于在没有样板文件的情况下使用给定参数配置cli类
  • C++模板行为,其中可以用CLI类定义命名元组
    • 代码完成应该在IDE中工作(完成:围绕此进行一次黑客攻击…)
    • configure应该知道用params链接配置文件
  • 配置文件要求将fissle与用户代码复制到同一目录中
    • 现在独立于位置
  • 解析配置和帮助/描述需要单独的步骤
    • 很高兴有一个单一的访问点和导入要求
  • 基本级帮助(<;脚本>;--h)不打印子命令
    • 固定在Fire v0.2.1中
  • 查看自动完成选项(iirc,fire可能有现成的功能)
    • 记录在案

待办事项:

  • 以合理的方式生成手册页
    • 尽管fire v0.2.1帮助看起来像一个手册页
  • 可能是一个日志设置(--dryrun)
    • 默认调试日志记录包装器,用于记录调用的每个函数
  • 工具和安装辅助工具
    • flit至少不能在windows上运行。(与git bash一起使用)
    • 允许dev使用任何设置的deshell或替代方法
  • 修复Firev0.2.1的文档字符串和参数帮助
  • 更好的名称
  • 一些理智的测试
  • \u init\u清除代码

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java开关大小写不返回字符串   java消除Pascals三角形上的前导空格   当用户更改单元格时,仅当用户   调试时,java“this”在片段中不可用   JavaJSFDataTable“优雅”地编辑行内容   java Javafx组合框自动完成返回错误   数组如何在java中将数据从firebase加载到arraylist   java的html问题。木卫一。在浏览器上打印多个空格时使用PrintWriter   java如何在后台下载文件,而不考虑应用程序的状态?   java如何在Eclipse中设置实例断点?   java N1QL二级索引不使用参数化IN子句   多线程在Java中干净地停止线程侦听serversocket   java如何在selenium服务器上检查测试问题   java Hibernate查询。executeUpdate()执行许多查询   java如何从Jenkins文件传递多个参数,如env、凭证、cucumber标记   java保护从子类的子类访问成员