本文以 http://docs.openstack.org/developer/cliff/demoapp.html 中例子为基础,稍作修改。
cliff(Command Line Interface Formulation Framework)可以用来快速构建命令行程序。cliff源于OpenStack项目的Oslo。
(1)项目的目录结构及主功能文件
根据python的包规则,cliffdemo中放置__init__.py文件
注意:需要安装cliff
pip install cliff
#main.py import logging import sys from cliff.app import App from cliff.commandmanager import CommandManager class DemoApp(App): LOG = logging.getLogger(__name__) def __init__(self): super(DemoApp, self).__init__( description='cliff demo app', version='0.1', command_manager=CommandManager('cliff.demo'), ) def initialize_app(self, argv): self.LOG.debug('initialize_app') def prepare_to_run_command(self, cmd): self.LOG.debug('prepare_to_run_command %s', cmd.__class__.__name__) def clean_up(self, cmd, result, err): self.LOG.debug('clean_up %s', cmd.__class__.__name__) if err: self.LOG.debug('got an error: %s', err) def main(argv=sys.argv[1:]): myapp = DemoApp() return myapp.run(argv) if __name__ == '__main__': sys.exit(main(sys.argv[1:]))
#list.py import logging import os from cliff.lister import Lister class Files(Lister): """Show a list of files in the current directory. The file name and size are printed by default. """ log = logging.getLogger(__name__) def take_action(self, parsed_args): return (('Name', 'Size'), ((n, os.stat(n).st_size) for n in os.listdir('.')) )
#show.py import logging import os from cliff.show import ShowOne class File(ShowOne): "Show details about a file" log = logging.getLogger(__name__) def get_parser(self, prog_name): parser = super(File, self).get_parser(prog_name) parser.add_argument('filename', nargs='?', default='.') return parser def take_action(self, parsed_args): stat_data = os.stat(parsed_args.filename) columns = ('Name', 'Size', 'UID', 'GID', 'Modified Time', ) data = (parsed_args.filename, stat_data.st_size, stat_data.st_uid, stat_data.st_gid, stat_data.st_mtime, ) return (columns, data)
#simple.py import logging from cliff.command import Command class Simple(Command): "A simple command that prints a message." log = logging.getLogger(__name__) def take_action(self, parsed_args): self.log.info('sending greeting') self.log.debug('debugging') self.app.stdout.write('hi!\n') class Error(Command): "Always raises an error" log = logging.getLogger(__name__) def take_action(self, parsed_args): self.log.info('causing error') raise RuntimeError('this is the expected exception')
(2)setup.py文件的编写
#coding=utf-8 #!/usr/bin/env python PROJECT = 'cliffdemo' # Change docs/sphinx/conf.py too! VERSION = '0.1' from setuptools import setup, find_packages try: long_description = open('README.rst', 'rt').read() except IOError: long_description = '' setup( name=PROJECT, version=VERSION, description='Demo app for cliff', #项目描述 long_description=long_description, author='Doug Hellmann', #项目作者 author_email='[email protected]', #项目Email url=' #项目主页 download_url=' #项目下载地址 classifiers=['Development Status :: 3 - Alpha', 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.2', 'Intended Audience :: Developers', 'Environment :: Console', ], platforms=['Any'], #适用于任何操作系统平台 scripts=[], provides=[], install_requires=['cliff'], #安装时需求的模块,这里需要cliff,执行时会自动安装。 namespace_packages=[], packages=find_packages(), include_package_data=True, entry_points={ #主入口 'console_scripts': [ 'cliffdemo = cliffdemo.main:main' ], #命令行对应的执行模块,例如files对应的就是cliffdemo.list:Files 'cliff.demo': [ 'simple = cliffdemo.simple:Simple', 'two_part = cliffdemo.simple:Simple', 'error = cliffdemo.simple:Error', 'list files = cliffdemo.list:Files', 'files = cliffdemo.list:Files', 'file = cliffdemo.show:File', 'show file = cliffdemo.show:File', ], }, zip_safe=False, )
(3)生成命令行
进入setup.py所在的目录
执行下面的命令,命令就被生成
python setup.py install
生成完毕,就可以执行cliffdemo命令了,执行后结果如下:
里面列出了所有可以执行的命令,是不感到眼熟,与前面的文件对应起来了吧!!!
再来执行其他命令试试:
cliff构建命令行程序是非常高效的。
(4)发布到pypi
首先应该去 https://pypi.python.org/pypi?%3Aaction=register_form 注册一个账号
注册完毕,再回到setup.py所在的目录
执行下面命令生成pip对应的zip包,具体可以通过python setup.py --help-commands查看帮助
python setup.py sdist #生成*.zip/*.tar.gz文件,支持pip安装
其他命令在这里注明一下:
python setup.py bdist_egg #生成*.egg文件,支持easy_install安装 python setup.py bdist_wininst #生成exe文件 python setup.py bdist_rpm #生成rpm文件
生成zip文件之后,再登录pypi,输完命令之后会提示输入你的账号和密码
python setup.py register
上传,一般只需上传zip格式的即可,上传成功就会提示成功,注意这里cliffdemo的名字已被使用,请换一个尝试!
python setup.py sdist upload
(5)安装
最激动的一步来了,为了确保测试效果应该先把之前的安装卸载掉
pip uninstall cliffdemo
尝试一下,等待安装完毕
pip install cliffdemo
(6)试验一下