新手向——用python編寫命令行應(yīng)用的簡潔方式

The easy (and nice) way to do CLI apps in Python——github源碼 為一個(gè)簡單的python命令行應(yīng)用的基本結(jié)構(gòu)。

我們有一些方法可以做出Python命令行式app。我試過它們骚秦,不過它們大都有自己的痛點(diǎn)和煩惱灼伤。所以我到社區(qū)里去尋找一種更好的方法策添。

什么是CLI恋捆?

CLI 意味著命令行界面(command line interface)棵逊。它是一類用命令行/終端調(diào)用的app万矾。作為開發(fā)人員悼吱,更是一個(gè)少用鼠標(biāo),多用鍵盤黨良狈,我一直使用CLI應(yīng)用后添。當(dāng)我需要一些為自己服務(wù)的定制軟件時(shí),CLI就能滿足我的需求们颜,而python是一門能夠快速生產(chǎn)CLI應(yīng)用的偉大語言吕朵。

文件系統(tǒng)結(jié)構(gòu)

pycli/
├── README.md
├── install.sh
├── pycli
  ├── __init__.py
  ├── __main__.py
  ├── classmodule.py
  └── funcmodule.py
└── setup.py

正如你所見,該項(xiàng)目的根目錄被我命名為pycli窥突。該應(yīng)用也將在setup.py中被設(shè)置為以名稱pycli被調(diào)用努溃。

CLI子目錄

在該CLI根目錄下只有一個(gè)子目錄。它的名字和CLI應(yīng)用同名阻问,但是在更復(fù)雜的CLI應(yīng)用中梧税,你需要有多個(gè)包。每個(gè)子目錄是每個(gè)包的容器。在我的簡單案例中第队,只有單個(gè)包哮塞,也就是單個(gè)子目錄。

__init__.py

這個(gè)文件(文件)放在這里是告訴Python這個(gè)目錄是一個(gè)包凳谦。它可以是空的忆畅,只是做個(gè)關(guān)于包的簡單提示;也可以包含實(shí)際代碼尸执,在包自身初始化時(shí)會被運(yùn)行家凯。

__main__.py

這是重要部分,是我們CLI應(yīng)用的入口如失,根目錄下的setup.py中的安裝配置會指示它绊诲。這里只是放些簡單的代碼在這里表明它起作用了。

import sys
from .classmodule import MyClass
from .funcmodule import my_function
def main(): 
# 以下內(nèi)容中的參數(shù)解析方式并不好褪贵,這里只是為了簡單
# 最好使用argparse或者click模塊做這方面的工具
    print('in main')
    args = sys.argv[1:]
    print('count of args :: {}'.format(len(args)))
    for arg in args:
        print('passed argument :: {}'.format(arg))
    my_function('hello world')
    my_object = MyClass('Thomas')
    my_object.say_name()
#以下無關(guān)于包安裝掂之,只是為了本文件的測試
if __name__ == '__main__':
    main()

上面所做的只是引入一些其它模塊,分析被傳入CLI的命令行參數(shù)脆丁,然后使用導(dǎo)入模塊的成員(一個(gè)簡單的函數(shù)和一個(gè)簡單的類)世舰。

classmodule.py

一個(gè)被導(dǎo)入__main__.py并被實(shí)例化的極簡的類(也沒啥用)。這里是為了說明如何從同一個(gè)包里的其它模塊中引入一個(gè)類偎快。

class MyClass():
    def __init__(self, name):
        self.name = name
    def say_name(self):
        print('name is {}'.format(self.name))

funcmodule.py

classmodule.py展示如何為__main__.py定義一個(gè)可以導(dǎo)入的類冯乘,funcmodule.py展示了如何定義一個(gè)簡單的函數(shù)讓__main__.py導(dǎo)入并調(diào)用

def my_function(text_to_display):
    print('text from my_function :: {}'.format(text_to_display))

setup.py

現(xiàn)在讓我們回到CLI源碼的根目錄晒夹。setup.py文件將所有東西聯(lián)系在一起并告訴Python如何處理它們裆馒。

from setuptools import setup
setup(
    name = 'pycli',
    version = '0.1.0',
    packages = ['pycli'],
    entry_points = {
        'console_scripts': [
            'pycli = pycli.__main__:main'
        ]
    })

第一眼看上去可能覺得很復(fù)雜。但是全部工作只是從setuptools庫導(dǎo)入setup函數(shù)丐怯,并傳入一些參數(shù)來調(diào)用它喷好。其中大部分是不言自明的。packages參數(shù)是根目錄下所有包的列表读跷。
entry_points是重要部分梗搅。它用字符串表明當(dāng)前應(yīng)用該以什么名稱被調(diào)用,以及被運(yùn)行時(shí)真正調(diào)用的是什么效览。這里寫的是pycli = pycli.__main__:main无切,也就是說,該應(yīng)用被叫做pycli丐枉,當(dāng)執(zhí)行該應(yīng)用時(shí)它會調(diào)用pycli包下的__main__模塊的main函數(shù)哆键。就是這樣!

install.sh

安裝你的Python CLI應(yīng)用的最佳方式是使用pip(python3則是pip3)瘦锹。在CLI源碼的根目錄下運(yùn)行pip3 install . 將會使用setup.py作為"指令"安裝這個(gè)應(yīng)用籍嘹,同樣闪盔,使用pip3 uninstall pycli卸載這個(gè)應(yīng)用。

寫在腳本中即是

pip3 uninstall pycli -y  # 標(biāo)簽-y意味著確認(rèn)卸載
pip3 install .

這樣會安裝到python Lib的site-packages中辱士,或者更簡潔的是

pip3 install -e .

這樣是在當(dāng)前根目錄下生成了egg-info文件泪掀,而在site-packages文件夾中生成一個(gè)egg-link鏈接,如下圖


這樣颂碘,就可以直接運(yùn)行install.sh以現(xiàn)有的CLI源碼來更新原來的CLI應(yīng)用了异赫。

總結(jié)

掌握了簡單的流程,用python編寫命令行程序是簡潔高效的凭涂。使用結(jié)果如首圖贴妻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市名惩,隨后出現(xiàn)的幾起案子澎胡,更是在濱河造成了極大的恐慌攻谁,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戚宦,死亡現(xiàn)場離奇詭異,居然都是意外死亡锈嫩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進(jìn)店門呼寸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艳汽,“玉大人,你說我怎么就攤上這事对雪『雍” “怎么了?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵瑟捣,是天一觀的道長馋艺。 經(jīng)常有香客問我,道長迈套,這世上最難降的妖魔是什么捐祠? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮交汤,結(jié)果婚禮上雏赦,老公的妹妹穿的比我還像新娘劫笙。我一直安慰自己,他們只是感情好星岗,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布填大。 她就那樣靜靜地躺著,像睡著了一般俏橘。 火紅的嫁衣襯著肌膚如雪允华。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天寥掐,我揣著相機(jī)與錄音靴寂,去河邊找鬼。 笑死召耘,一個(gè)胖子當(dāng)著我的面吹牛百炬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播污它,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼剖踊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衫贬?” 一聲冷哼從身側(cè)響起德澈,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎固惯,沒想到半個(gè)月后梆造,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葬毫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年镇辉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片供常。...
    茶點(diǎn)故事閱讀 38,711評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摊聋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出栈暇,到底是詐尸還是另有隱情麻裁,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布源祈,位于F島的核電站,受9級特大地震影響手销,放射性物質(zhì)發(fā)生泄漏图张。R本人自食惡果不足惜诈悍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一侥钳、第九天 我趴在偏房一處隱蔽的房頂上張望柄错。 院中可真熱鬧,春花似錦给猾、人聲如沸颂跨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹲诀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脯爪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工尚揣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留快骗,地道東北人塔次。 一個(gè)月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓励负,卻偏偏與公主長得像,于是被迫代替她去往敵國和親继榆。 傳聞我的和親對象是個(gè)殘疾皇子汁掠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評論 2 350

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