利用cliff快速构建命令行程序与setuptools的打包与上传

本文以 http://docs.openstack.org/developer/cliff/demoapp.html  中例子为基础,稍作修改。

cliff(Command Line Interface Formulation Framework)可以用来快速构建命令行程序。cliff源于OpenStack项目的Oslo。

(1)项目的目录结构及主功能文件

155906_if0n_553781.png

根据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命令了,执行后结果如下:

162634_PMok_553781.png

里面列出了所有可以执行的命令,是不感到眼熟,与前面的文件对应起来了吧!!!

再来执行其他命令试试:

162840_tQXI_553781.png

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

165304_xQTF_553781.png

上传,一般只需上传zip格式的即可,上传成功就会提示成功,注意这里cliffdemo的名字已被使用,请换一个尝试!

python setup.py sdist upload


(5)安装

最激动的一步来了,为了确保测试效果应该先把之前的安装卸载掉

pip uninstall cliffdemo

尝试一下,等待安装完毕

pip install cliffdemo


(6)试验一下

162634_PMok_553781.png


转载于:https://my.oschina.net/crooner/blog/620365

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值