前面学委给大家缕一缕了如何开发一个python库并导入运行, 基本完成了一个初步的库
下面指导大家把库做成命令行工具,别人就能像我们使用python或者pip工具一样,输入命令就能使用我们的库!
读者可以查看学委主页加入交流,或者去GitHub给个Star。
把Python库做成命令行的准备
项目结构如下,首先要让它支持命令行。
记得前面的项目截图里面还有一个setup.py 文件。
setup.py组织了整个项目模块代码和基础信息,支持命令行的诀窍就在里面。
先看一下代码,大家重点观察一个熟悉:entry_points 。
# -*- coding: utf-8 -*- # @CSDN/Juejin/Wechat: 雷学委 # @XueWeiTag: OpenSource # @File : setup.py # @Project : pypi_seed from distutils.core import setup from setuptools import find_packages setup(name='pypi_seed', # 包名 version='1.0.3', # 版本号 keywords=("pypi_seed", "seed", "generator", "levin", "leixuewei"), description='A small tool to demo on upload package to pypi and utility scripts to generate a pypi seed', long_description="""A small tool to demo on upload package to pypi and utility scripts to generate a pypi seed! Powered by py4ever team!""", author='levin', author_email='790839397@qq.com', #项目联系人 url='https://github.com/py4ever/pypi_seed', #学委删简了一些,非本文重点的信息 entry_points={ 'console_scripts': [ 'pypiseed = pypi_seed.main:main', 'pyseed = pypi_seed.main:main' ] }, classifiers=[ 'Intended Audience :: Developers' # 学委删简了一些支持多版本的,需要的去github或者gitee借鉴pypi_seed的setup.py ], )
解释一下setup.py
简单理解,这个setup.py 就相当于一个开源模块的地图。
它包括了作者信息,项目说明,版本,项目链接,更重要的,安装后命令行的程序入口就放在“entry_points"。
设置了entry_points, 我们使用pip工具安装这个模块的时候,它会自动帮我们创建相应的文件。
比如上面的entry_points是两个命令工具:
pypiseed 为命令行工具,对等与调用pypi_seed.main:main
pyseed 为命令行工具,对等与调用pypi_seed.main:main
补充说明setup.py其他参数解释
重点是作者,项目名称,联系信息,下面整理解释:
name : 项目名称,特别重要!其他开发者通过这个来搜索你的库
author : 作者
keywords : 项目关键字
description : 项目说明
author_email : 作者邮箱信息
url : 项目主页
这些比较直白,根据开源工具的定位来编写完善。
项目说明如果写不下,就放置在long description字段。万一用户在用的时候有啥反馈,还能够联系到邮箱,或者通过项目主页继续互动,这样能够保持项目的不断完善,与时俱进!
第二步 开发一个命令行处理的Python程序
生成了程序入口了,我们可以通过
pyseed 参数 #调用pypi_seed了
好了,说完entry_points, 它调用到了pypi_seed.main:main。 学委已经帮大家看了源码了。
pypiseed / pyseed里面调用了一个程序内的show_help 和args2dict 两个方法。
开源项目源码解析
这里是show_help方法,重点是输出打印一些使用信息,和项目简易说明。
def show_help(): print('usage:') print('-h, --help: print help message.') print('-p, --project: your desired project name') print('-P, --path: where to save the sample project after code-generation') print('-a, --author: the author information') print("===========================================") show_sample_run() show_about()
这里就是本文的核心了,解析用户的输入。
为了解析方便,学委仅摘取了核心代码段,我们看一下。
import sys import getopt def args2dict(): argv = sys.argv[1:] if '-h' in argv or '--help' in argv: show_help() exit(0) try: opts, args = getopt.getopt(argv, "p:P:a", ["path=", "author=", "project="]) except Exception as e: raise ValueError("Looks like missing value, please check usage by '-h'. Current error : %s " % str(e)) project = author = path = None for opt, arg in opts: if opt in ['-p', '--project']: project = arg elif opt in ['-a', '--author']: author = arg elif opt in ['-P', '--path']: path = arg if project is None: print("please input project with '-p' or '--project', e.g. -p my_project ") raise ValueError("Missing project") if author is None: print("please input author with '-a' or '--author', e.g. -a whoami ") raise ValueError("Missing author") if path is None: path = os.getcwd() print("path is not given, so will use default as current directory : %s" % path) return dict(project=project, author=author, path=path)
核心代码讲解
这里主要是分三步
获取终端参数,判断是否输出帮助
使用getopt内置库来解析p:P:a参数(-a, -P, -p) 处理为一个字典dict(管理project/author/path等信息)
返回字典给生成器调用,生成种子项目。
最后使用命令行调用你的库:
安装你的库:
pip install pypi_seed
使用命令如下:
pyseed -p demo_proj -a testuser -P '.'
效果如下,这么简单就生成了,项目了,稍微开发就能成为一个自己的模块,并分享。
总结
别人找到你的库就很不容易了,命令行的使用也必须力求简洁易懂 ,务必把帮助提示也做的友好一些,方便快速使用嘛!
学会使用setup.py 高效的组织项目代码和配置。
开发命令行工具重点是处理用户输入的参数。
一个优秀的开源项目需要提供简便的使用帮助。
完善的开源项目代码在这:Pypi-Seed on Github