本文以 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='doug.hellmann@gmail.com', #项目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)试验一下