1. 程式人生 > >python3 重複監聽介面並更新下載檔案

python3 重複監聽介面並更新下載檔案

詳細場景如下:定時監聽介面,介面根據傳來的version值與當前版本對比,如果版本號一致,則繼續監聽,否則下載更新並執行一個shell指令碼。

主要使用了urllib庫中request模組完成。

詳細程式碼如下:

from threading import Timer
import urllib.request
import json
import os


def hello():
    print("hello hello")
    t = Timer(2, qaq)   # 八個小時為28800
    t.start()


def cbk(a, b, c):
    """回撥函式
    @a:已經下載的資料塊
    @b:資料塊的大小
    @c:遠端檔案的大小
    """

    per = 100.0*a*b/c
    if per > 100:
        per = 100
    print('%.2f%%' % per)


def compare_version(data):
    url = 'http://www.flasktest.com/version'

    # response = urllib.request.Request(url)
    # html = urllib.request.urlopen(response)

    data_encode = urllib.parse.urlencode(data).encode('utf-8')
    response = urllib.request.Request(url, data_encode)  # 獲取返回值
    html = urllib.request.urlopen(response)

    print(html.getcode())
    msg = html.read().decode()
    print(msg)
    msg = json.loads(msg)
    print(type(msg['version_now']))
    if msg['ret']:  # version不同則下載更新,並且更新當前的version的值
        print('download')
        download_url = msg['download_url']
        urllib.request.urlretrieve(download_url, 'down.html', cbk)  # 第一個引數指向url地址,第二個為儲存地址,第三個是回撥函式用於顯示下載進度
        os.system('./use.sh')
        data['version'] = msg['version_now']
        t = Timer(10, compare_version, (data,))
        t.start()
    else:
        print('keep listening')
        t = Timer(1, compare_version, (data,))
        t.start()


if __name__ == "__main__":
    version = {"version": '1.0'}
    compare_version(version)

定時任務主要是通過thread庫中Timer來實現的,Timer的第一個引數指間隔時間,第二個引數是指呼叫函式,第三個引數是向呼叫函式傳遞的引數(注意,這裡的引數我使用的是一個tuple型別的,這裡好像對引數型別有限制)

下載則是urllib.request中的urlretrieve,urlretrieve,第一個引數指向url地址,第二個為儲存地址,第三個是回撥函式用於顯示下載進度,下載進度這裡,我的請求連結沒有content-length這個欄位導致檔案總大小得不到,檢視urlretrieve的原始碼發現,如果得不到content-length,那麼會設定總檔案大小為-1,就會顯示-819200.00%這種進度,所有要在返回值里加上Content-Length這個欄位才會正常顯示下載進度。