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
将模式的模板化简化为仅定义其中的属性(即a
和x
)
例子)。它们有固定的方式:
# 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.a
、c.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
配置文件和环境变量
c
decorator/configuration按优先级顺序将多个配置选项链接在一起(数字越低,数字越高):
- 命令行参数
- 环境变量
- 配置文件定义
- 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环境 已使用/已激活
依赖关系
- fire-来自google的python fire执行cli包装
完成时间:
- 在帮助中显示参数/如何以编程方式将namedtuple的签名传递给cli函数?
- 需要进行代码生成,即将签名写入一个单独的python文件并评估它?
- 有什么特殊的消防技巧吗?cli(c)定义不起作用。
- 可能覆盖"usage"部分或生成docstring
- 创建一个伴生类,该类描述namedtuple字段的函数
- 硬编码默认机制
- 配置分析器
- decorator或其他一些包装器,用于在没有样板文件的情况下使用给定参数配置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清除代码