Remind-You Part2. setup.py打包代碼, socket通訊

插線板的英文是socket噢K┟凇!!

內(nèi)容

  • 完成dict plugin的服務(wù)端啟動(dòng)socket監(jiān)聽
  • 將Project使用setuptools進(jìn)行打包
  • 生成客戶端程序save_word
  • 使用argparse解析命令行參數(shù)

倉庫代碼中的day2分支 https://github.com/bymzy/remind-you/tree/day2

效果

使用python setup.py bdist_rpm生成rpm包替蛉,然后使用rpm -ivh remind_you-0.1-1.noarch.rpm安裝庐杨。python庫目錄中將會(huì)安裝remind_you包隶症,同時(shí)會(huì)在系統(tǒng)目錄中增加可執(zhí)行文件save_word句狼。
啟動(dòng)dict plugin服務(wù)端:

服務(wù)端啟動(dòng)后许起,dict plugin監(jiān)聽在目標(biāo)端口

執(zhí)行save_word命令

save_word命令執(zhí)行

可以看到十偶,客戶端執(zhí)行save_word命令后,服務(wù)端能夠收到客戶端的消息园细。

使用的庫

setuptools

使用setuptools對(duì)整個(gè)代碼打包(個(gè)人比較喜歡打成rpm包python setup.py bdist_rpm惦积,方便安裝刪除)。同時(shí)猛频,使用setuptools生成可執(zhí)行文件(save_word)狮崩。倉庫最上層目錄下的setup.py文件記錄了配置信息,代碼如下:

from setuptools import setup, find_packages

setup(
    name = 'remind_you',
    version = '0.1',
    packages = find_packages(),
    package_data = { 
        '':['*.conf']
    },  
    data_files = [('/etc/', ['remind_you/plugins/scheduler.conf'])],
    author = 'mingzhengying',
    description = 'remind you something!!!',
    entry_points = { 
        'console_scripts': [
            'save_word = remind_you.cmds:save_word_cmd',
            ]   
    }   
)

setuptools是distutils的加強(qiáng)版本鹿寻,上述配置文件中重要部分說明如下

  • packages = find_packages() 表示在當(dāng)前setup.py同等目錄下尋找源文件
  • package_data 部分表示將所有的包目錄下*.conf文件進(jìn)行打包
  • data_files用來將配置文件睦柴,安裝到/etc目錄下
  • console_scripts用來生成命令行執(zhí)行程序,程序的執(zhí)行入口是remind_you.cmds.save_word_cmd這個(gè)函數(shù)

socket毡熏, argparse

使用最簡(jiǎn)單的socket阻塞模型坦敌。dict plugin讀取配置文件,然后監(jiān)聽在特定的端口上∮剑客戶端命令運(yùn)行后同樣讀取配置文件杜顺,連接服務(wù)器端。

dict plugin服務(wù)端代碼如下:

def generate_request(_word, _trans):
    trans = pack_int(_trans)
    word = pack_str(_word)
    totalLen = 4 + len(trans) + len(word)
    return pack_int(totalLen) + trans + word

def recv_request(cl):
    tmp = recv_len(cl, 4)
    wordLen = unpack_int(tmp)
    data = recv_len(cl, wordLen)
    trans = unpack_int(data[0:4])
    word = unpack_str(data[4:])
    return word, trans

def run(args):
    print 'my pid is: %u , %s ' % (os.getpid(), args)
    port = args.get('port')
    ip = args.get('ip')
    dbPath = args.get('db')

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((ip, port))
    sock.listen(5)

    while True:
        cl, addr = sock.accept()
        word, trans = recv_request(cl)
        print 'receive word %s , need trans %d: ' % (word, trans)
        cl.close()

run方法作為dict plugin進(jìn)程的主方法蘸炸,會(huì)被主進(jìn)程啟動(dòng)躬络,然后監(jiān)聽在某個(gè)端口上。后續(xù)有客戶端連接后搭儒,從客戶端的輸入中解析出請(qǐng)求的word, trans穷当,分別表示單詞,和是否返回翻譯信息淹禾。目前的實(shí)現(xiàn)中馁菜,服務(wù)端僅僅會(huì)將得到的信息打印出來,然后斷開連接等待下個(gè)請(qǐng)求稀拐。


客戶端代碼如下:

cmds.py

from plugins import dict_cmd

def save_word_cmd():
    dict_cmd.run()

setup.py配置中火邓,生成的客戶端命令save_word最終會(huì)調(diào)用save_word_cmd丹弱,進(jìn)而調(diào)用dict_cmd.run()方法德撬。

dict_cmd.py

CONF = '/etc/scheduler.conf'
PLUGIN_NAME = 'dict'

def get_ip_port():
    with open(CONF) as f:
        data = f.read()

    di = json.loads(data)
    for plugin in di.get('plugins', []):
        if plugin.get('name') == PLUGIN_NAME:
            return plugin.get('args').get('ip'), plugin.get('args').get('port')
    return None, None

def parse_cmd_args():
    args_parser = argparse.ArgumentParser()
    args_parser.add_argument("-w", "--word", type=str, required=True);
    args_parser.add_argument('-t', '--trans', action='store_true', default=False);

    args = args_parser.parse_args()
    #use vars to get a dict
    #print vars(args), type(vars(args))
    return args.word, args.trans

def run():
    ip, port = get_ip_port()
    word, trans = parse_cmd_args()
    s = connect_ip_port(ip, port)
    if s is None:
        print 'connect to server %s:%d failed!!!' % (ip, port)
        sys.exit(1)
    req = generate_request(word, trans)
    send_data(s, req)

客戶端的save_word命令,調(diào)用dict_cmd.run()方法后會(huì)做如下事情:

  • 讀取配置文件得到服務(wù)端的ip躲胳,port
  • 解析命令行參數(shù)
  • 生成請(qǐng)求req數(shù)據(jù)
  • 調(diào)用send_data將req數(shù)據(jù)發(fā)送給服務(wù)端

send_data, connect_ip_port等函數(shù)在util.py中定義

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜓洪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子坯苹,更是在濱河造成了極大的恐慌隆檀,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粹湃,死亡現(xiàn)場(chǎng)離奇詭異恐仑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)为鳄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門裳仆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人孤钦,你說我怎么就攤上這事歧斟。” “怎么了偏形?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵静袖,是天一觀的道長。 經(jīng)常有香客問我俊扭,道長队橙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮捐康,結(jié)果婚禮上畅姊,老公的妹妹穿的比我還像新娘。我一直安慰自己吹由,他們只是感情好若未,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著倾鲫,像睡著了一般粗合。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乌昔,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天隙疚,我揣著相機(jī)與錄音,去河邊找鬼磕道。 笑死供屉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溺蕉。 我是一名探鬼主播伶丐,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼疯特!你這毒婦竟也來了哗魂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤漓雅,失蹤者是張志新(化名)和其女友劉穎录别,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邻吞,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡组题,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抱冷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崔列。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖徘层,靈堂內(nèi)的尸體忽然破棺而出峻呕,到底是詐尸還是另有隱情,我是刑警寧澤趣效,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布瘦癌,位于F島的核電站,受9級(jí)特大地震影響跷敬,放射性物質(zhì)發(fā)生泄漏讯私。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斤寇。 院中可真熱鬧桶癣,春花似錦、人聲如沸娘锁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莫秆。三九已至间雀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镊屎,已是汗流浹背惹挟。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缝驳,地道東北人连锯。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像用狱,于是被迫代替她去往敵國和親运怖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • 內(nèi)容 1. 將Part2中接收到的客戶端請(qǐng)求單詞齿拂,存入sqlite數(shù)據(jù)庫中驳规。 2. 將主程序打包成命令remind...
    帶不動(dòng)明少閱讀 419評(píng)論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)署海,斷路器,智...
    卡卡羅2017閱讀 134,600評(píng)論 18 139
  • supervisor 是由python語言編寫医男、基于linux操作系統(tǒng)的一款服務(wù)器管理工具砸狞,用以監(jiān)控服務(wù)器的運(yùn)行,...
    每次哭都笑著奔跑閱讀 6,280評(píng)論 6 14
  • 人們喜歡看十字繡镀梭,從前面看特別好看刀森,完美無暇。但是后面你看不見的地方报账,亂線交錯(cuò)研底,丑陋無比。這才是最真實(shí)的人透罢,Ta從...
    一個(gè)人的春夏秋冬閱讀 398評(píng)論 6 6
  • 總會(huì)想起若干年前榜晦,冬日里爺爺家的磚瓦房上升起的裊裊炊煙,仿佛已成了春節(jié)的符號(hào)羽圃,刻印在我深深的記憶里乾胶。 彼時(shí)尚小,那...
    紙人貓閱讀 354評(píng)論 0 1