原文出處: 無與童比 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行業人員進入!