原文出处: 无与童比 html
上次写的一个终端里面斗鱼TV弹幕Python版本和Ruby版本,而且发布到PIP和RubyGems上面.在发布PIP包的时候,竟然Google不到一篇能够很是好的讲解这个流程的文章.因而整理这篇文章,而且方便后来本身检索,而且方便他人找资料.python
自推荐下依照本文定制的命令行工具danmu.fm的github地址:git
https://github.com/twocucao/danmu.fmgithub
本文的目的也是很是简单:数据库
写一个Python命令行工具,而且发布到PIP上面.而且在这个过程当中给出我本身的一些思考.编程
只须要进行以下的两个步骤即可以:安全
1.写好一个Python命令行工具.架构
2.发布它.app
固然,这样不够细致.再细分一下.ide
1.写好一个Python命令行工具
1.1.命令行的特色,以及Python的如何编写命令行
1.2.如何组织代码结构.
2.发布
2.1.注册pypi帐户
2.2.注册在帐户下面注册Python包
2.3.上传打包好的Python命令行工具.
3.完善代码
写好一个命令行工具首先要知道命令行工具是什么?
在我看来,命令行工具就是一种完成某种类型的任务的终端程序.
也就是基本上没有什么用户界面的程序.
因为基本上没有什么用户界面,因此致使单个命令行的交互能力及其低下.但这种低下的交互性对于一些固定工做而言,简直就是最灵活的工具.只须要输入一些命令即可以完成某种类型的工做.实在是方便的很.
因此,某种程度上,终端程序低交互的缺点反而成了优势.
对于Python和命令行交互,咱们很容易想出一个比较方便的方案.
sys.argv就是这样的嘛!
咱们很容易这样写代码.
1 |
python testargv.py thisisaargv1 |
甚至咱们也能够这样写命令行,
1 |
python testargv.py thisisaargv1 -d -f 0 |
那么,这样写的后果就是,不方便解析出(不是不能,是不方便) -d -f 0 以及 thisisaargv1.
不信的话,你解析一个下面场景的命令行试试,
1 2 3 4 |
# 用户可能这样输入 danmu.fm http://www.douyutv.com/xiaocang -q 1 -v 2 danmu.fm -q 1 -v 2 http://www.douyutv.com/xiaocang # 固然,确定还有漏写啦,等等,你得须要转类型,增长各类blablabla的描述吧,添加默认的参数值吧. |
因而Python就提供了一个很是好用的模块可使用.叫作argparse.
上面的描述就变成了这个样子
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import argparse
APP_DESC=""" 这就是描述 """ print(APP_DESC) if len(sys.argv) == 1: sys.argv.append('--help') parser = argparse.ArgumentParser() parser.add_argument('-q','--quality',type=int,default=0,help="download video quality : 1 for the standard-definition; 3 for the super-definition") parser.add_argument('-v','--verbose', default=0,help="print more debuging information") parser.add_argument('-s','--store',help="保存流媒体文件到指定位置") parser.add_argument('-c','--config',default=0,help="读取~/.danmu.fm配置,请~/.danmu.fm指定数据库") parser.add_argument('url',metavar='URL',nargs='+', help="zhubo page URL (http://www.douyutv.com/*/)") args = parser.parse_args() # 获取对应参数只须要args.quality,args.url之类. url = (args.url)[0] print(url) #其余执行逻辑 |
保存为danmu.py
这样就能够执行命令
1 |
python danmu.py http://www.douyutv.com/xiaocang -q 1 -v 2 |
经过args就能够获取参数,而后进行终端程序的参数初始化.
但是这和咱们的要求仍是不一样嘛,咱们不想多写Python XXX,咱们想直接XXX.就像这样.
1 |
danmu.fm -q 1 -v 2 http://www.douyutv.com/xiaocang |
不急,下面就是了.
因而,如今就要开始组织代码结构了.
咱们在最终的代码目录大概是这样的.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
danmu.fm ├── README.md ├── danmufm │ ├── __init__.py │ ├── client │ │ ├── __init__.py │ │ ├── __init__.pyc │ │ ├── douyu_client.py │ │ └── douyu_danmu_client.py │ ├── danmu.py │ ├── misc │ │ ├── __init__.py │ │ ├── color_printer.py │ │ ├── downloaders.py │ │ └── player.py │ └── model │ ├── __init__.py │ └── douyu_msg.py ├── docs ├── setup.cfg ├── setup.py ├── sh.py └── tests |
这就是我上次写的danmu.fm的代码目录.
聪明的你这时候你注意到了:
主要的程序不是放在根目录下面,而是放在第二目录danmufm下面.
2.setup.cfg 是什么鬼东西
3.setup.py 是什么鬼东西
对于上面几点,咱们分别进行解释
为了把主要的程序分离出来,放在第二目录下面,这样的待会打包之后多出不少文件夹就不会对源码形成干扰.
固然,因为把程序放在了第二目录下面,因此,脚本里面的from import语句应该使用相对路径导入.
相对路径导入的的时候须要注意运行的时候使用以下命令
1 |
python3 -m danmufm.danmu [xxxx] |
填写以下内容便可.
1 2 |
[metadata] description-file = README.md |
而后去写Markdown的Readme就行了.
这个是重头戏了.
setup这个py文件就是打包配置文件.对这个程序是谁的,有什么依赖,入口是什么,等等等等的配置.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#-*- encoding: UTF-8 -*- from setuptools import setup, find_packages """ 打包的用的setup必须引入, """
VERSION = '0.1.1'
setup(name='danmu.fm', version=VERSION, description="a tiny and smart cli player of douyutv,ximalayad,anmu based on Python", long_description='just enjoy', classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers keywords='python douyu danmu danmu.fm terminal', author='twocucao', author_email='twocucao@gmail.com', url='https://github.com/twocucao/doumu.fm', license='MIT', packages=find_packages(), include_package_data=True, zip_safe=True, install_requires=[ 'requests', ], entry_points={ 'console_scripts':[ 'danmu.fm = danmufm.danmu:main' ] }, ) |
官方有distutils这个包管理器工具,设置也很是的简单,只是,它不支持entry_points属性,因为没法使用entry_point,也就没法经过命令来跳转到指定模块运行程序,这也就意味着,官方工具不方便写成命令行.仍是setuptools好.
上面须要注意的就是install_requires能够添加依赖.其余的你猜均可以猜出来是作什么的.本身去看代码,我就很少说了.
所谓的发布,就是将打包好的程序的某个版本发布到某个仓库中.
到这个上面注册帐号:
https://pypi.python.org/pypi
进入对应项目根文件,而后执行
1 |
python3 setup.py register |
这一步程序会让你输入刚刚注册的帐号和密码,而后注册该包.注册该包之后,你就有了一个小仓库.能够存放不一样版本的danmu.fm.
注册的仓库是能够在这个地址看到的,
https://pypi.python.org/pypi?%3Aaction=pkg_edit&name=danmu.fm
这里须要借助一个小工具,twine.twine是一个更加安全方便上传打包好的代码的工具.
1 |
pip3 install twine |
接着开始打包,打包成两个版本,一个是不须要build的版本,另外一个是须要build的版本(顺带吐槽下,这两个诡异的命名).
1 |
python setup.py sdist bdist_wheel |
因而剩下来的就显而易见了,上传build完毕的程序到仓库中.
1 |
twine upload dist/danmu.fm-0.1.2* |
因而,安装一下,测试是否成功
1 |
pip3 install danmu.fm --upgrade |
命令行的工具是这样使用的.
1 |
danmu.fm -q 2 -v 1 http://www.douyutv.com/16789 |
不断的完善代码,而后打包终端程序发布到仓库给别人用,这就是整个的PIP打包发布流程.
这个时候,你可能须要使用版本控制软件.
你可能须要增多的代码的测试.
http://cxy.liuzhihengseo.com/483.html
问啊-定制化IT教育平台,牛人一对一服务,有问必答,开发编程社交头条 官方网站:www.wenaaa.com 下载问啊APP,参与官方悬赏,赚百元现金。
QQ群290551701 汇集不少互联网精英,技术总监,架构师,项目经理!开源技术研究,欢迎业内人士,大牛及新手有志于从事IT行业人员进入!