Python Cli 编写指南

python实现cli

环境:

  • python 3.8

  • python自带argparse

指南

简单示例 : cli.py

import argparse

def cli():
parser = argparse.ArgumentParser(description='CLI描述')
subparsers = parser.add_subparsers(metavar='子命令') # 添加子命令,演示没有参数
one_parser = subparsers.add_parser('one', help='第一个命令')
one_parser.set_defaults(handle=handle_one) # 解析命令
args = parser.parse_args()
# 1.第一个命令会解析成handle,使用args.handle()就能够调用
if hasattr(args, 'handle'):
args.handle(args)
# 2.如果没有handle属性,则表示未输入子命令,则打印帮助信息
else:
parser.print_help() def handle_one(args):
print('handle_one') if __name__ == '__main__':
cli()

调用:

$ python cli.py
usage: cli_1.py [-h] 子命令 ... CLI描述 positional arguments:
子命令
one 第一个命令 optional arguments:
-h, --help show this help message and exit $ python cli.py one
handle_one

增加第二个命令

import argparse

def cli():
parser = argparse.ArgumentParser(description='CLI描述')
subparsers = parser.add_subparsers(metavar='子命令') # 添加子命令,演示没有参数
one_parser = subparsers.add_parser('one', help='第一个命令')
one_parser.set_defaults(handle=handle_one) # 添加子命令,演示有参数
two_parser = subparsers.add_parser('two', help='第二个命令')
# 参数(简写,全称,类型,是否必填,帮助说明)
two_parser.add_argument('-s', '--str', type=str, required=True,
help='一个字符串类型参数')
# 参数(简写,全称,类型,默认值,帮助说明)
two_parser.add_argument('-d', '--default', type=str, default='默认值',
help='这个命令有默认值')
# 参数(简写,全称,类型,帮助说明)
two_parser.add_argument('-ts', '--the-str', type=str,
help='当全称有横线时,属性名转换为下划线,即 the_str')
two_parser.set_defaults(handle=handle_two) # 解析命令
args = parser.parse_args()
# 1.第一个命令会解析成handle,使用args.handle()就能够调用
if hasattr(args, 'handle'):
# 1.1.其他参数会被解析成args的属性,以命令全称为属性名
args.handle(args)
# 2.如果没有handle属性,则表示未输入子命令
else:
parser.print_help() def handle_one(args):
# 无参数
print('handle_one') def handle_two(args):
print('handle_two')
print(f'str:{args.str}')
print(f'default:{args.default}')
print(f'the-str:{args.the_str}') if __name__ == '__main__':
cli()
  • 调用:
$ python cli.py
usage: cli.py [-h] 子命令 ... CLI描述 positional arguments:
子命令
one 第一个命令
two 第二个命令 optional arguments:
-h, --help show this help message and exit
  • 调用one不受影响
$ python cli.py one
handle_one
  • 调用two会显示需要必填项-s
$ python cli.py two
usage: cli.py two [-h] -s STR [-d DEFAULT] [-ts THE_STR]
cli.py two: error: the following arguments are required: -s/--str
  • 输入-h查看帮助
$ python cli.py two -h
usage: cli.py two [-h] -s STR [-d DEFAULT] [-ts THE_STR] optional arguments:
-h, --help show this help message and exit
-s STR, --str STR 一个字符串类型参数
-d DEFAULT, --default DEFAULT
这个命令有默认值
-ts THE_STR, --the-str THE_STR
当全称有横线时,属性名转换为下划线,即 the_str
  • 输入-s参数(或全称--str)

    • 可以看到加了默认值的会显示默认值
    • 没默认值且非必填项值为None
$ python cli.py two -s 哈哈
handle_two
str:哈哈
default:默认值
the-str:None
  • 输入有默认值的参数-d (或全称--default)

    • 输入的值会覆盖默认值
$ python cli.py two -s 哈哈 --default 改了
handle_two
str:哈哈
default:改了
the-str:None
  • 输入所有参数
$ python cli.py two -s 哈哈 --default 改了 -ts 赋值了
handle_two
str:哈哈
default:改了
the-str:赋值了

其他代码使用

在"setup.py"文件中

import setuptools

setuptools.setup(
# 省略其他参数
entry_points={
'console_scripts': [
'my-cli = my.cli:cli'
]
}
)
  • 'my-cli = my.cli:cli'就是替换内容

    • 'my-cli'

      • 上传pypi后,拉取这个库,就能够使用'my-cli'来调用cli
      • 如'my-cli one' / 'my-cli two -h'
    • 'my.cli:cli'
      • '完整类名:方法名'
      • 目录结构如下方结构
      • cli命令需要放在模块下
      • 不能放在根目录下,否则会报错找不到模块

文件目录结构:

root

  • my

    • __init__.py
    • cli.py

参考资料:

https://zhuanlan.zhihu.com/p/79710598

Python Cli 编写指南的更多相关文章

  1. python 函数编写指南

    #函数编写指南:1.给函数指定描述性名称,且只在其中是用小写字母和下划线 2.每个函数都应包含简要的阐述其功能的注释,该注释应紧跟在函数定义后面,且采用文档字符串格式 3.给形参指定默认值时,等号两边 ...

  2. SecureCRT中python脚本编写

    SecureCRT中python脚本编写学习指南 SecureCRT python 引言 在测试网络设备中,通常使用脚本对设备端进行配置和测试以及维护:对于PE设备的测试维护人员来说使用较多是Secu ...

  3. 基于Asterisk的VoIP开发指南——(2)Asterisk AGI程序编写指南

    原文:基于Asterisk的VoIP开发指南--(2)Asterisk AGI程序编写指南 5. Asterisk AGI程序编写指南 5.1概述 很多时候,我们需要在拨号方案中做某些业务逻辑的判断或 ...

  4. Python 内编写类的各种技巧和方法

    Python 内编写类的各种技巧和方法 简介 有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象 ...

  5. PEP 8 - Python代码样式指南

    PEP 8 - Python代码样式指南 PEP: 8 标题: Python代码风格指南 作者: Guido van Rossum <python.org上的guido>,Barry Wa ...

  6. Python 编码风格指南

    原文:http://python.jobbole.com/84618/ 本文超出 PEP8 的范畴以涵盖我认为优秀的 Python 风格.本文虽然坚持己见,却不偏执.不仅仅涉及语法.模块布局等问题,同 ...

  7. Effective Python之编写高质量Python代码的59个有效方法

                                                         这个周末断断续续的阅读完了<Effective Python之编写高质量Python代码 ...

  8. Python中编写类的各种技巧和方法

    简介 有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Pickling). 你可以把它当作一 ...

  9. Python开发人员指南

    本指南是一个全面的资源贡献 给Python的 -为新的和经验丰富的贡献者.这是 保持由维护的Python同一社区.我们欢迎您对Python的贡献! 快速参考 这是设置和添加补丁所需的基本步骤.了解基础 ...

  10. PEP8中文版 -- Python编码风格指南

    Python部落组织翻译, 禁止转载 目录      缩进      制表符还是空格?      行的最大长度      空行      源文件编码      导入      无法忍受的      其 ...

随机推荐

  1. 蓝牙mesh组网实践(dataflash的占用与管理)

    目录 蓝牙mesh协议中有不少数据需要存储dataflash,以记录网络中的数据.一些数据只需要配网时保存进dataflash,比如说本节点的网络地址.各类密钥等:另一些数据需要在运行中动态更新,比如 ...

  2. Linux 在miniconda和anaconda同时安装时,卸载miniconda

    1. 找到miniconda目录,删除. rm -rf miniconda3/ 2. 编辑bashrc sudo vim .bashrc setup路径改回anaconda3的,注释掉"&g ...

  3. python_类 对象 属性

    1, 类 (class) 类的概念表示某种对象的集合,用于表示某一种相同对象的模板.例如:人作为一个类 由这个"人"类定义出来的内容就是这个类定义出来的对象,类还拥有属性和功能,属 ...

  4. vscode 报错command line option ‘-std=c11‘ is valid for C/ObjC but not for C++

    cc1plus.exe: warning: command-line option '-std=c17' is valid for C/ObjC but not for C++ 编译运行出现警告,原因 ...

  5. memoの左手转右手

    说的是坐标系. 假设两个坐标系都是X向右,Y向上.那么,右手系的Z是从屏幕垂直向外,左手系的Z就是垂直屏幕向里. 向量假设是列向量.(OpenGL系的毛病啊,列向量,右手系,泪目) 先说结论 变换矩阵 ...

  6. 加密算法和hash

    随着安全问题越来越被重视,公司也全面替换了HTTP为HTTPS.2015年iOS9的ATS到今年苹果更是放出话来,2017年全面支持HTTPS,不支持的App,在审核的时候可能会遇到麻烦.鉴于此,我有 ...

  7. 1. ansible学习总结: 基础模块

    copy模块: #传输文件到目标机 ansible -i /kingdee/ansible/host all -m copy -a 'src=/tmp/aaaa.tgz dest=/tmp/aaaa. ...

  8. 安装jdk,tomcat,oracle,PL/SQL的一些问题

    仅限于自己学习使用 新进公司,需要安装jdk1.6,tomcat6, oracle和pl/sql 先是jdk1.6,安装后配置环境变量,都在系统变量里,在cmd,分别打出 java -version, ...

  9. 【python】pip的问题

    在更新pip的时候因为安装pip需要管理员权限,但是呢,又把pip给uninstall了 所以结果就是没有pip这个模块了 https://stackoverflow.com/questions/18 ...

  10. javascript获取浏览器窗口分辨率|浏览器全屏分辨率|屏幕分辨率

    浏览器窗口分辨率指显示网页的区域,在PC端由于浏览器窗口大小可调节,这个值是可变的.在手机等移动端浏览器窗口大小不可调节,宽度值是固定的,但竖屏和横屏切换会改变. 浏览器全屏分辨率是指浏览器启用全屏显 ...