没有项目描述

cmdi的Python项目详细描述


CMDI-命令界面

说明

一种修饰程序,它将一个称为命令接口的特殊接口应用于其修饰函数。最初是为构建库编写的

命令界面允许您通过命令界面控制函数的执行。

  • 它允许您保存/重定向/禁用输出流(stdout/stderr)以实现其修饰功能。这在文件描述符级别工作,因此可以重定向子进程和C代码的输出。
  • 它允许您捕捉其修饰函数的异常,并使用cmdresult()返回它们,包括返回代码错误消息和有色的状态消息
  • 它允许您在运行时打印命令的状态消息和摘要。
  • 还有更多…

@command修饰的函数可以接收一组特殊的关键字参数(\u verbose=…\u stdout=…\u stderr=…catch\u err=…等),并返回一个cmdresult()对象。

要求

python>;=3.7

安装

pip install cmdi

用法

@命令装饰器

使用@命令装饰符将命令接口应用于函数。

fromcmdiimportcommand@commanddeffoo_cmd(x,**cmdargs)->CmdResult:print(x)returnx*2

现在您可以使用foo_cmd作为命令

result=foo_cmd(10)

它将打印以下输出(彩色):

Cmd: foo_cmd
------------
10
foo_cmd: Ok

并返回一个cmdresult对象:

CmdResult(val=20,code=0,name='foo_cmd',status='Ok',color=0,stdout=None,stderr=None)

命令函数参数

您可以使用一组应用于修饰函数的特殊关键字argumnets来定义命令函数的行为。

在本例中,我们将foo-cmd的输出重定向到自定义编写器并捕获异常,然后使用cmdresult()对象返回异常的输出和信息:

fromcmdiimportCmdResult,Piperesult=foo_cmd(10,_stdout=Pipe(),_catch_err=True)isinstance(result,CmdResult)# Trueprint(result.stdout)# prints caught output.

有关特殊关键字参数的详细信息,请参阅下面的API文档。

自定义命令函数的结果

命令总是返回一个cmdresult对象,对于该对象,@command包装函数会自动猜测值,这在许多情况下都足够了。但有时需要对输出进行细粒度控制,例如创建特定于函数的返回代码:

@commanddeffoo_cmd(x:str,**cmdargs)->CmdResult:print(x)somestr="foo"+xifx=="bar":code=0else:code=42# Return a customized Command Result:returnCmdResult(val=somestr,code=code,)

注意:在上面的示例中,我们返回一个自定义的cmdresult,我们只为其自定义字段valcode。您可以自定义cmdresult对象的每个字段(可选)。您漏掉的字段将自动设置。

命令接口包装器

有时,您希望对现有函数使用命令接口,而不接触函数定义。您可以通过创建命令接口包装器来完成此操作:

fromcmdiimportcommand,strip_cmdargs,CmdResult# This function wraps the Command Interface around an existing function:@commanddeffoo_cmd(x,**cmdargs)->CmdResult:returnfoo(**strip_cmdargs(loclas()))# The original function that is being wrapped:deffoo(x)->int:print(x)returnx*2

命令接口包装器和子进程返回代码。

如果需要为运行子流程的现有函数创建命令接口包装器,并且您的命令依赖于该函数的返回代码,则可以使用子流程.calledprocesserror异常来编写某些内容。例如:

importsubprocessasspfromcmdiimportcommand,CmdResult,Status@commanddeffoo_cmd(x,**cmdargs)->CmdResult:try:returnfoo(**strip_cmdargs(locals()))exceptsp.CalledProcessErrorase:ife.returncode==13:returnCmdResult(code=e.returncode,status=Status.ok,)elife.returncode==42:returnCmdResult(code=e.returncode,status=Status.skip,)else:raisesp.CalledProcessError(e.returncode,e.args)deffoo(x)->int:returnsp.run(["my_arg"],check=True,...)

API

装饰器@command

此装饰器允许您将命令界面应用于函数。

@command修饰的函数可以采用以下关键字参数:

详细:bool=true

在运行时启用/禁用打印标题/状态消息。

示例:

pip install cmdi
0

颜色:bool=true

启用/禁用标题/状态消息的颜色。

示例:

pip install cmdi
1

\u标准输出:可选[管道]=无< /代码>

重定向子函数的stdout。

示例:

pip install cmdi
2

\u stderr:union[可选[管道],stdout]=无

重定向子函数的stderr。

示例:

pip install cmdi
3

如果要将stderr重定向到stdout,则可以使用此命令:

pip install cmdi
4

捕获错误:bool=true

从子函数捕获错误。

这将允许运行时继续,即使子函数抛出异常。如果发生异常,则cmdresult对象将在result.stderrresult.coderesult.status提供有关错误的信息。状态信息将显示为红色。

示例: 从CMDI导入管道

pip install cmdi
5

数据类cmdresult()

命令结果对象。

@command修饰的函数返回cmdresult对象:

pip install cmdi
6

数据类pipe()

使用此类型为命令调用配置stdout/stderr

参数

  • save:bool=true-如果true
  • text:bool=true-如果true,则将函数输出另存为文本否则另存为字节。
  • dup:bool=false-如果true,则在文件描述器级别重定向输出。这允许您重定向子流程和C代码的输出。
  • tty:bool=false-如果true,则保留保存输出的ANSI序列,否则删除ANSI序列。
  • 静音:bool=false-如果true,则将终端功能调用的输出静音。注意:如果启用此选项,您仍然可以保存并返回输出。

示例:

pip install cmdi
7

重定向运行子进程或C代码的函数输出。

如果要重定向运行子进程或调用C代码的函数的输出,则必须使用带参数dup=true管道。这将在较低级别捕获stdout/stderr的输出(通过复制文件描述符):

pip install cmdi
8

函数strip\u cmdargs(locals)

参数

  • 本地语言:dict[str,any]

返回

  • dict[str,any]

从字典中删除cmdargs。 此函数对于命令接口包装器

示例用法:

pip install cmdi
9

功能打印标题(结果、颜色、文件)

参数

  • 结果:命令结果
  • 颜色:bool=true
  • 文件:可选[io[str]]=无

返回

打印命令结果的标题

示例用法:

fromcmdiimportcommand@commanddeffoo_cmd(x,**cmdargs)->CmdResult:print(x)returnx*2
0

输出:

fromcmdiimportcommand@commanddeffoo_cmd(x,**cmdargs)->CmdResult:print(x)returnx*2
1

功能打印状态(结果、颜色、文件)

参数

  • 结果:命令结果
  • 颜色:bool=true
  • 文件:可选[io[str]]=无

返回

打印命令结果的状态。

示例用法:

fromcmdiimportcommand@commanddeffoo_cmd(x,**cmdargs)->CmdResult:print(x)returnx*2
2

输出:

fromcmdiimportcommand@commanddeffoo_cmd(x,**cmdargs)->CmdResult:print(x)returnx*2
3

功能打印结果(结果、颜色、文件)

参数

  • 结果:命令结果
  • 颜色:bool=true
  • 文件:可选[io[str]]=无

返回

打印出CmdResult对象。

示例用法:

fromcmdiimportcommand@commanddeffoo_cmd(x,**cmdargs)->CmdResult:print(x)returnx*2
4

输出:

fromcmdiimportcommand@commanddeffoo_cmd(x,**cmdargs)->CmdResult:print(x)returnx*2
5

功能打印摘要(结果、颜色、标题、文件)

参数

  • 结果:命令结果
  • 颜色:bool=true
  • 标题:bool=true
  • 文件:可选[io[str]]=无

返回

fromcmdiimportcommand@commanddeffoo_cmd(x,**cmdargs)->CmdResult:print(x)returnx*2
6

输出:

fromcmdiimportcommand@commanddeffoo_cmd(x,**cmdargs)->CmdResult:print(x)returnx*2
7

功能读取管道(p,间隔)

参数

  • p:subprocess.popen
  • interval:int=10-输出流的读写间隔。

返回

  • 迭代器[元组[str,str]]

这将返回一个迭代器,该迭代器逐行返回stdoutstderr的popen pipes。

示例用法:

fromcmdiimportcommand@commanddeffoo_cmd(x,**cmdargs)->CmdResult:print(x)returnx*2
8

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

推荐PyPI第三方库


热门话题
java通过Sybase Jconnect JDBC驱动程序与DBCP建立连接   java从ListPreference获取keyValue   java如何在安卓中定义视图的宽度和高度   字符串数组的Java置换   java问题:在字符串和字节数组之间转换时长度发生了变化?   一些Windows机器上的java JMenu字体奇怪地以粗体显示   使用java 8的小程序类的ClassNotFoundException   带有SQLite的java多项选择题测验应用程序(新活动中不显示分数)   Java在转换为列表后插入数组   JDBCType4Java。lang.ClassNotFoundException:com。mysql。jdbc。驾驶员   按键启动计时器,java   java在JavaFX中播放不带扩展名的音频文件   从服务器运行notes java代理时,ssl没有受信任的证书   java如何更新Google云数据流中的现有记录?   java NoClassDefFoundError:io/netty/util/Timer   Spring MVC控件属性的java设置值   带有spring security 5和oauth2的java日历客户端   java中的几个LWJGL问题