如何發(fā)布一個Python命令行工具

本文簡介

上次寫的一個終端里面斗魚TV彈幕Python版本和Ruby版本,并且發(fā)布到PIP和RubyGems上面.在發(fā)布PIP包的時候,居然Google不到一篇可以非常好的講解這個流程的文章.于是整理這篇文章,并且方便后來自己檢索,并且方便他人找資料.

自推薦下依照本文定制的命令行工具danmu.fm的github地址:

https://github.com/twocucao/danmu.fm

本文的目的也是非常簡單:

寫一個Python命令行工具,并且發(fā)布到PIP上面.并且在這個過程中給出我自己的一些思考.

如何分解這個發(fā)布任務(wù)?

只需要進(jìn)行如下的兩個步驟便可以:

  • 1.寫好一個Python命令行工具.
  • 2.發(fā)布它.

當(dāng)然,這樣不夠細(xì)致.再細(xì)分一下.

  • 1.寫好一個Python命令行工具
    • 1.1.命令行的特點(diǎn),以及Python的如何編寫命令行
    • 1.2.如何組織代碼結(jié)構(gòu).
  • 2.發(fā)布
  • 2.1.注冊pypi賬戶
    • 2.2.注冊在賬戶下面注冊Python包
    • 2.3.上傳打包好的Python命令行工具.
  • 3.完善代碼

1.寫好一個Python命令行工具

寫好一個命令行工具首先要知道命令行工具是什么?

在我看來,命令行工具就是一種完成某種類型的任務(wù)的終端程序.

也就是基本上沒有什么用戶界面的程序.

由于基本上沒有什么用戶界面,所以導(dǎo)致單個命令行的交互能力及其低下.但這種低下的交互性對于一些固定工作而言,簡直就是最靈活的工具.只需要輸入一些命令便可以完成某種類型的工作.實(shí)在是方便的很.

所以,某種程度上,終端程序低交互的缺點(diǎn)反而成了優(yōu)點(diǎn).

1.1.Python的如何編寫一個簡單的命令行

對于Python和命令行交互,我們很容易想出一個比較方便的方案.

sys.argv就是這樣的嘛!

我們很容易這樣寫代碼.

 python testargv.py thisisaargv1

甚至我們也可以這樣寫命令行,

 python testargv.py thisisaargv1 -d -f 0 

那么,這樣寫的后果就是,不方便解析出(不是不能,是不方便) -d -f 0 以及 thisisaargv1.

不信的話,你解析一個下面場景的命令行試試,

# 用戶可能這樣輸入
danmu.fm http://www.douyutv.com/xiaocang -q 1 -v 2 
danmu.fm -q 1 -v 2 http://www.douyutv.com/xiaocang
# 當(dāng)然,肯定還有漏寫啦,等等,你得需要轉(zhuǎn)類型,增加各種blablabla的描述吧,添加默認(rèn)的參數(shù)值吧.

于是Python就提供了一個非常好用的模塊可以使用.叫做argparse.

上面的描述就變成了這個樣子

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指定數(shù)據(jù)庫")
parser.add_argument('url',metavar='URL',nargs='+', help="zhubo page URL (http://www.douyutv.com/*/)")
args = parser.parse_args()
# 獲取對應(yīng)參數(shù)只需要args.quality,args.url之類.
url = (args.url)[0]
print(url)
#其他執(zhí)行邏輯

保存為danmu.py

這樣就可以執(zhí)行命令

python danmu.py http://www.douyutv.com/xiaocang -q 1 -v 2

通過args就可以獲取參數(shù),然后進(jìn)行終端程序的參數(shù)初始化.

可是這和我們的要求還是不同嘛,我們不想多寫Python XXX,我們想直接XXX.就像這樣.

danmu.fm -q 1 -v 2 http://www.douyutv.com/xiaocang

不急,下面就是了.

1.2.如何組織代碼結(jié)構(gòu).

于是,現(xiàn)在就要開始組織代碼結(jié)構(gòu)了.

我們在最終的代碼目錄大概是這樣的.

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的代碼目錄.

聰明的你這時候你注意到了:

  1. 主要的程序不是放在根目錄下面,而是放在第二目錄danmufm下面.
    2.setup.cfg 是什么鬼東西
    3.setup.py 是什么鬼東西

對于上面幾點(diǎn),我們分別進(jìn)行解釋

1.2.1 為什么主要程序在第二目錄下

為了把主要的程序分離出來,放在第二目錄下面,這樣的待會打包以后多出很多文件夾就不會對源碼造成干擾.

當(dāng)然,由于把程序放在了第二目錄下面,所以,腳本里面的from import語句應(yīng)該使用相對路徑導(dǎo)入.

相對路徑導(dǎo)入的的時候需要注意運(yùn)行的時候使用如下命令

python3 -m danmufm.danmu [xxxx]

1.2.2 setup.cfg

填寫如下內(nèi)容即可.

[metadata]
description-file = README.md

然后去寫Markdown的Readme就好了.

1.2.3 setup.py

這個是重頭戲了.

setup這個py文件就是打包配置文件.對這個程序是誰的,有什么依賴,入口是什么,等等等等的配置.


#-*- 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這個包管理器工具,設(shè)置也非常的簡單,只是,它不支持entry_points屬性,由于無法使用entry_point,也就無法通過命令來跳轉(zhuǎn)到指定模塊運(yùn)行程序,這也就意味著,官方工具不方便寫成命令行.還是setuptools好.

上面需要注意的就是install_requires可以添加依賴.其他的你猜都可以猜出來是做什么的.自己去看代碼,我就不多說了.

2.發(fā)布

所謂的發(fā)布,就是將打包好的程序的某個版本發(fā)布到某個倉庫中.

2.1.注冊pypi賬戶

到這個上面注冊賬號:
https://pypi.python.org/pypi

2.2.注冊在賬戶下面注冊Python包

進(jìn)入對應(yīng)項(xiàng)目根文件,然后執(zhí)行

python3 setup.py register

這一步程序會讓你輸入剛剛注冊的賬號和密碼,然后注冊該包.注冊該包以后,你就有了一個小倉庫.可以存放不同版本的danmu.fm.

注冊的倉庫是可以在這個地址看到的,
https://pypi.python.org/pypi?%3Aaction=pkg_edit&name=danmu.fm

2.3.上傳打包好的Python命令行工具.

這里需要借助一個小工具,twine.twine是一個更加安全方便上傳打包好的代碼的工具.

pip3 install twine

接著開始打包,打包成兩個版本,一個是不需要build的版本,另一個是需要build的版本(順帶吐槽下,這兩個詭異的命名).

python setup.py sdist bdist_wheel

于是剩下來的就顯而易見了,上傳build完畢的程序到倉庫中.

twine upload dist/danmu.fm-0.1.2*

于是,安裝一下,測試是否成功

pip3 install danmu.fm --upgrade

命令行的工具是這樣使用的.

danmu.fm -q 2 -v 1 http://www.douyutv.com/16789

3.完善

不斷的完善代碼,然后打包終端程序發(fā)布到倉庫給別人用,這就是整個的PIP打包發(fā)布流程.

  • 這個時候,你可能需要使用版本控制軟件.
  • 你可能需要增多的代碼的測試.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颤难,一起剝皮案震驚了整個濱河市燃乍,隨后出現(xiàn)的幾起案子歪泳,更是在濱河造成了極大的恐慌贮懈,老刑警劉巖沸呐,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旬牲,死亡現(xiàn)場離奇詭異仿粹,居然都是意外死亡搁吓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門吭历,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堕仔,“玉大人,你說我怎么就攤上這事晌区∧牵” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵朗若,是天一觀的道長仿吞。 經(jīng)常有香客問我,道長捡偏,這世上最難降的妖魔是什么唤冈? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮银伟,結(jié)果婚禮上你虹,老公的妹妹穿的比我還像新娘。我一直安慰自己彤避,他們只是感情好傅物,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琉预,像睡著了一般这刷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绩衷,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天声畏,我揣著相機(jī)與錄音,去河邊找鬼娄帖。 笑死也祠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的近速。 我是一名探鬼主播诈嘿,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼削葱!你這毒婦竟也來了奖亚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤析砸,失蹤者是張志新(化名)和其女友劉穎昔字,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體干厚,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡李滴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年螃宙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片所坯。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡谆扎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芹助,到底是詐尸還是另有隱情堂湖,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布状土,位于F島的核電站无蜂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蒙谓。R本人自食惡果不足惜斥季,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望累驮。 院中可真熱鬧酣倾,春花似錦、人聲如沸谤专。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽置侍。三九已至映之,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜡坊,已是汗流浹背杠输。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留算色,地道東北人抬伺。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓螟够,卻偏偏與公主長得像灾梦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妓笙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容