如何使用python自定义命令
dir、tree、cd等等,都是我们常见的命令。这些命令是开发者开发出来的,如果我们自己想按照自己的想法开发一个命令,应该怎么做呢?
以python语言来实现,问题就是:如何使用python自定义命令?
需求场景如下:
1、cmd007 作为自定义命令名称
2、cmd007 hello --name=Lily 作为自定义功能1的名称hello打招呼,输出:Hi, Lily
3、cmd007 eat --food=fish 作为自定义功能2的名称food吃东西,输出:I like to eat fish
(一)目录结构如下:
cmd007 # 文件夹必须和自定义命令同名
│ __init__.py
│ __main__.py
(二)实现自定义命令和功能1
在__main__.py中
- from __future__ import unicode_literals
- import click
- import os
- import sys
- __version__ = "1.1.dev2"
- def verbose_option(f):
- def callback(ctx, param, value):
- pass
- return click.option("-v", "--version",
- is_flag=True,
- expose_value=False,
- help="Enable verbose output",
- callback=callback)(f)
- def quiet_option(f):
- def callback(ctx, param, value):
- pass
- return click.option('-q', '--quiet',
- is_flag=True,
- expose_value=False,
- help='Silence warnings',
- callback=callback)(f)
- def common_options(f):
- f = verbose_option(f)
- f = quiet_option(f)
- return f
- pgk_dir = os.path.dirname(os.path.abspath(__file__))
- @click.group(context_settings={'help_option_names': ['-h', '--help']})
- @click.version_option(
- '{0} from {1} (Python {2})'.format(__version__, pgk_dir, sys.version[:3]),
- '-V', '--version')
- @common_options
- def cli():
- """
- cmd007 - my cmd named cmd007
- """
- # 自定义功能:hello
- @cli.command(name="hello")
- @click.option('-n', '--name', help="please input name")
- @click.option('-c', '--count', help="print times", default=1)
- def hello_command(name, count):
- for x in range(count):
- print("Hi, {0}".format(name))
- if __name__ == '__main__':
- cli()
来到cmd007的上级目录下,调出命令行客户端,执行命名:
python cmd007
python cmd007 -V
python cmd007 hello --name=Lily --count=3
python cmd007 hello -n Lilei -c 2
分别输出:
提示:如果将这个python包cmd007打包发布,然后安装到python中去,那么每行命令就不用输入python关键字了。
(三)实现自定义命令、功能1、功能2
在__main__.py中增加代码
- # 自定义功能2:eat
- @cli.command(name="eat")
- @click.option('-f', '--food', help="please input your like food")
- @click.option('-a', '--and-you', help="ask echo other", default=False)
- def hello_command(food, and_you):
- print("I like to eat {0}".format(food))
- if and_you in ['t', 'T', 'true', 'True', True, 1, "1"]:
- print("And what is your favorite food ?")
完整版:
- from __future__ import unicode_literals
- import click
- import os
- import sys
- __version__ = "1.1.dev2"
- def verbose_option(f):
- def callback(ctx, param, value):
- pass
- return click.option("-v", "--version",
- is_flag=True,
- expose_value=False,
- help="Enable verbose output",
- callback=callback)(f)
- def quiet_option(f):
- def callback(ctx, param, value):
- pass
- return click.option('-q', '--quiet',
- is_flag=True,
- expose_value=False,
- help='Silence warnings',
- callback=callback)(f)
- def common_options(f):
- f = verbose_option(f)
- f = quiet_option(f)
- return f
- pgk_dir = os.path.dirname(os.path.abspath(__file__))
- @click.group(context_settings={'help_option_names': ['-h', '--help']})
- @click.version_option(
- '{0} from {1} (Python {2})'.format(__version__, pgk_dir, sys.version[:3]),
- '-V', '--version')
- @common_options
- def cli():
- """
- cmd007 - my cmd named cmd007
- """
- # 自定义功能1:hello
- @cli.command(name="hello")
- @click.option('-n', '--name', help="please input name")
- @click.option('-c', '--count', help="print times", default=1)
- def hello_command(name, count):
- for x in range(count):
- print("Hi, {0}".format(name))
- # 自定义功能2:eat
- @cli.command(name="eat")
- @click.option('-f', '--food', help="please input your like food")
- @click.option('-a', '--and-you', help="ask echo other", default=False)
- def hello_command(food, and_you):
- print("I like to eat {0}".format(food))
- if and_you in ['t', 'T', 'true', 'True', True, 1, ""]:
- print("And what is your favorite food ?")
- if __name__ == '__main__':
- cli()
执行
python cmd007 eat -f fish --and-you=1
输出
延伸:
@click.option()中的参数详解:https://blog.csdn.net/weixin_31866177/article/details/82111586
每个参数解释如下:
- name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, --foo。
- action - 命令行遇到参数时的动作,默认值是 store。
- store_const,表示赋值为const;
- append,将遇到的值存储成列表,也就是如果参数重复则会保存多个值;
- append_const,将参数规范中定义的一个值保存到一个列表;
- count,存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析;
- nargs - 应该读取的命令行参数个数,可以是具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const;或者是 * 号,表示 0 或多个参数;或者是 + 号表示 1 或多个参数。
- const - action 和 nargs 所需要的常量值。
- default - 不指定参数时的默认值。
- type - 命令行参数应该被转换成的类型。
- choices - 参数可允许的值的一个容器。
- required - 可选参数是否可以省略 (仅针对可选参数)。
- help - 参数的帮助信息,当指定为
argparse.SUPPRESS
时表示不显示该参数的帮助信息. - metavar - 在 usage 说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.
- dest - 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.
如何使用python自定义命令的更多相关文章
- Python之TensorFlow的变量收集、自定义命令参数、矩阵运算、梯度下降-4
一.TensorFlow为什么要存在变量收集的过程,主要目的就是把训练过程中的数据,比如loss.权重.偏置等数据通过图形展示的方式呈现在开发者的眼前. 自定义参数:自定义参数,主要是通过Python ...
- python+pytest,通过自定义命令行参数,实现浏览器兼容性跑用例
场景拓展: UI自动化可能需要指定浏览器进行测试,为了做成自定义配置浏览器,可以通过动态添加pytest的命令行参数,在执行的时候,获取命令行传入的参数,在对应的浏览器执行用例. 1.自动化用例需要支 ...
- cmd alias 自定义命令
简短步骤:1.关闭所有在运行的CMD窗口2.创建文件C:\cmd-alias.bat,包含以下内容:[python] view plain copydoskey sayhello=echo Hello ...
- flask框架(八)—自定义命令flask-script、多app应用、wtforms表单验证、SQLAIchemy
自定义命令flask-script 用于实现类似于django中 python3 manage.py runserver ...类似的命令,用命令行启动项目 首先安装:pip3 install fla ...
- 【AMAD】django-extensions -- Django框架的自定义命令扩展集合
动机 简介 个人评分 动机 使用Django进行开发的时候,会不会感觉开发工具少了一些.比如每次进入python shell调试的时候要重新import每个model. 简介 django-exten ...
- python制作命令行工具——fire
python制作命令行工具--fire 前言 本篇教程的目的是希望大家可以通读完此篇之后,可以使用python制作一款符合自己需求的linux工具. 本教程使用的是google开源的python第三方 ...
- 华为OPS,自定义命令,动态执行命令
OPS 开放可编程系统OPS(Open Programmability System)是指设备通过提供统一的应用程序接口API(Application Programming Interfa ...
- node生成自定义命令(yargs/commander)
第一部分可以生成一个自定义命令,例如常见的”express”,yargs和commander则可以在生成的自定义命令上做扩展,yargs将命令扩展成类似express --l xx的形式;而comma ...
- laravel 自定义命令
1.自定义命令:将自定义命令保存在app/Console/Commands,也可以在composer.json文件配置自动加载,自由选择想要放置的地方 php artisan make:console ...
随机推荐
- 如何切换svn的登陆账号?
如何切换svn的登陆账号? 听语音 原创 | 浏览:68661 | 更新:2017-10-06 09:09 1 2 3 4 5 6 分步阅读 对于程序员来说,svn使用的比较广泛,平时用来更新或者是提 ...
- Django Model 定义语法
简单用法 from django.db import models class Person(models.Model): first_name = models.CharField(max_leng ...
- spring AOP的基本概念
AOP的概念和使用原因 现实中有一些内容并不是面向对象(OOP)可以解决的,比如数据库事务,它对于企业级的Java EE应用而言是十分重要的,又如在电商网站购物需要经过交易系统.财务系统,对于交易系统 ...
- 小程序报错 thirdScriptError
thirdScriptError sdk uncaught third Error Unexpected token export SyntaxError: Unexpected token expo ...
- 使用jsPlumb插件实现动态连线功能
这周去看了两天的羽毛球亚锦赛,工作有提前晚上加班做一些,但是技术文章却拉下了. 这段时间一直在寻找可以实现前端元素动态连线的功能,找了好几个库,考虑过用d3或者原生svg和canvas来实现,最后和同 ...
- 路由(Routing)
路由(Routing) ASP.NET Core MVC 路由是建立在ASP.NET Core 路由的,一项强大的URL映射组件,它可以构建具有理解和搜索网址的应用程序.这使得我们可以自定义应用程序 ...
- 利用单臂路由实现vlan间路由
本实验模拟公司场景 通过路由器实现不同vlan部门间通讯,拓扑图如下
- js控制数量包含截取
<div class="usermes_index_line"> 进行中的单 <div id="usermes_index_line_i2"& ...
- K8S从入门到放弃系列-(13)Kubernetes集群mertics-server部署
集群部署好后,如果我们想知道集群中每个节点及节点上的pod资源使用情况,命令行下可以直接使用kubectl top node/pod来查看资源使用情况,默认此命令不能正常使用,需要我们部署对应api资 ...
- (十六)springMvc 补充
文章目录 数据回显 `@ModelAttribute` && `@SessionAttributes` 注解 数据回显 对 pojo 数据回显的支持 ,springMvc 会默认的将传 ...