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自定义命令的更多相关文章

  1. Python之TensorFlow的变量收集、自定义命令参数、矩阵运算、梯度下降-4

    一.TensorFlow为什么要存在变量收集的过程,主要目的就是把训练过程中的数据,比如loss.权重.偏置等数据通过图形展示的方式呈现在开发者的眼前. 自定义参数:自定义参数,主要是通过Python ...

  2. python+pytest,通过自定义命令行参数,实现浏览器兼容性跑用例

    场景拓展: UI自动化可能需要指定浏览器进行测试,为了做成自定义配置浏览器,可以通过动态添加pytest的命令行参数,在执行的时候,获取命令行传入的参数,在对应的浏览器执行用例. 1.自动化用例需要支 ...

  3. cmd alias 自定义命令

    简短步骤:1.关闭所有在运行的CMD窗口2.创建文件C:\cmd-alias.bat,包含以下内容:[python] view plain copydoskey sayhello=echo Hello ...

  4. flask框架(八)—自定义命令flask-script、多app应用、wtforms表单验证、SQLAIchemy

    自定义命令flask-script 用于实现类似于django中 python3 manage.py runserver ...类似的命令,用命令行启动项目 首先安装:pip3 install fla ...

  5. 【AMAD】django-extensions -- Django框架的自定义命令扩展集合

    动机 简介 个人评分 动机 使用Django进行开发的时候,会不会感觉开发工具少了一些.比如每次进入python shell调试的时候要重新import每个model. 简介 django-exten ...

  6. python制作命令行工具——fire

    python制作命令行工具--fire 前言 本篇教程的目的是希望大家可以通读完此篇之后,可以使用python制作一款符合自己需求的linux工具. 本教程使用的是google开源的python第三方 ...

  7. 华为OPS,自定义命令,动态执行命令

     OPS     开放可编程系统OPS(Open Programmability System)是指设备通过提供统一的应用程序接口API(Application Programming Interfa ...

  8. node生成自定义命令(yargs/commander)

    第一部分可以生成一个自定义命令,例如常见的”express”,yargs和commander则可以在生成的自定义命令上做扩展,yargs将命令扩展成类似express --l xx的形式;而comma ...

  9. laravel 自定义命令

    1.自定义命令:将自定义命令保存在app/Console/Commands,也可以在composer.json文件配置自动加载,自由选择想要放置的地方 php artisan make:console ...

随机推荐

  1. Qt编写自定义控件66-光晕时钟

    一.前言 在上一篇文章写了个高仿WIN10系统的光晕日历,这次来绘制一个光晕的时钟,也是在某些网页上看到的效果,时分秒分别以进度条的形式来绘制,而且这个进度条带有光晕效果,中间的日期时间文字也是光晕效 ...

  2. Silence Removal and End Point Detection MATLAB Code

    转载自:http://ganeshtiwaridotcomdotnp.blogspot.com/2011/08/silence-removal-and-end-point-detection.html ...

  3. 一文带你全面了解RxJava

    工作需要,刚好在学习 RxJava网络请求框架,网上搜了一些 关于RxJava 的教程,但都并不是很好理解,所幸最后找到了几篇有助于初学者了解 RxJava 的文章,于是结合自己的理解,重新整理成一篇 ...

  4. Machine Learning Glossary

    http://people.seas.harvard.edu/~mgelbart/glossary.html more at:http://www.metacademy.org/list

  5. [转帖]TPC-C解析系列03_TPC-C基准测试之SQL优化

    TPC-C解析系列03_TPC-C基准测试之SQL优化 http://www.itpub.net/2019/10/08/3330/ TPC-C是一个非常严苛的基准测试模型,考验的是一个完备的关系数据库 ...

  6. WCF-方法重载

    一.服务端重载 一般写法直接重载,但是会报错,如下. [ServiceContract] public interface IService1 { [OperationContract] string ...

  7. python 之 数据库(内置函数、流程控制、索引)

    10.17 内置函数 强调:mysql内置的函数只能在sql语句中使用 #数学函数 round(x,y) #返回参数x的四舍五入的有y位小数的值 rand() #返回0到1内的随机值,可以通过提供一个 ...

  8. PAT(B) 1051 复数乘法(Java)

    题目链接:1051 复数乘法 (15 point(s)) 参考博客:1051 复数乘法(PAT 乙级 C++实现)-guangjinzheng 题目描述 复数可以写成 (A+Bi) 的常规形式,其中 ...

  9. AVR单片机教程——随机点亮LED

    之前我们做的闪烁LED和流水灯,灯效都是循环的.这次我们来尝试一些不一样的——每一次随机选择一个LED并点亮. 要实现随机的效果,我们要用C语言标准库中的相关设施: #define RAND_MAX ...

  10. 【HC89S003F4开发板】 2调度器

    HC89S003F4开发板调度器调试 一.前言 逛论坛看到有人给HC89做了调度器,调度部分直接操作堆栈的. 下载链接 下载下来调试看看. 二.用户代码 @实现效果 编译后led灯闪烁 #includ ...