掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
本文轉(zhuǎn)載自微信公眾號(hào)「Python學(xué)會(huì)」,作者Huangwei AI。轉(zhuǎn)載本文請(qǐng)聯(lián)系Python學(xué)會(huì)公眾號(hào)。

網(wǎng)站設(shè)計(jì)、做網(wǎng)站服務(wù)團(tuán)隊(duì)是一支充滿著熱情的團(tuán)隊(duì),執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標(biāo)準(zhǔn)與要求,同時(shí)竭誠(chéng)為客戶提供服務(wù)是我們的理念。創(chuàng)新互聯(lián)公司把每個(gè)網(wǎng)站當(dāng)做一個(gè)產(chǎn)品來(lái)開(kāi)發(fā),精雕細(xì)琢,追求一名工匠心中的細(xì)致,我們更用心!
看門狗watch dog
通過(guò)閱讀本文,您將了解如何檢測(cè)對(duì)Python應(yīng)用程序中現(xiàn)有文件所做的更改。我們將使用一個(gè)維護(hù)良好的模塊,叫做看門狗(watchdog)。基于官方文檔,watchdog是一個(gè)用于監(jiān)視文件系統(tǒng)事件的Python API庫(kù)和shell實(shí)用程序。
它同時(shí)支持Python 2.7和3.4+。但是,對(duì)于舊版本,建議您使用watchdog < 0.10.0。在本教程中,我將只介紹Python API庫(kù)。讓我們繼續(xù)下一節(jié),開(kāi)始安裝必要的模塊。
設(shè)置
設(shè)置是相當(dāng)簡(jiǎn)單和直接的pip安裝。在繼續(xù)之前,強(qiáng)烈建議設(shè)置一個(gè)虛擬環(huán)境。有兩種方法
安裝在PyPI
在終端中運(yùn)行如下命令。
- pip install watchdog
它將安裝PyPI(在撰寫(xiě)本文時(shí)為0.10.2)的最新版本。
從代碼庫(kù)安裝
此外,您可以在本地文件夾中克隆存儲(chǔ)庫(kù)并正常安裝它。首先,讓我們使用以下命令克隆它。
- git clone --recursive git://github.com/gorakhargosh/watchdog.git
使用以下命令更改工作目錄。確保它在工作目錄中包含一個(gè)名為setup.py的文件。
- cd watchdog
運(yùn)行以下命令安裝它。
- pip install -e.
直接從存儲(chǔ)庫(kù)克隆它的一個(gè)主要優(yōu)點(diǎn)是,您可以獲得帶有附加特性的最新版本。
您可以在終端中運(yùn)行以下命令來(lái)驗(yàn)證安裝是否成功。
- pip show watchdog
讓我們繼續(xù)下一節(jié)并開(kāi)始編寫(xiě)Python代碼。
實(shí)現(xiàn)
watchdog的主要構(gòu)建模塊基于以下類:
因此,實(shí)現(xiàn)就像這樣簡(jiǎn)單:
事件處理程序
當(dāng)前模塊中有4種類型的事件處理程序可用:
其余的類繼承自FileSystemEventHandler,它提供了以下函數(shù)供我們重寫(xiě)。
導(dǎo)入
創(chuàng)建一個(gè)新的Python文件,并添加以下導(dǎo)入聲明。我把它命名為test.py。
- from watchdog.observers import Observer
- from watchdog.events import FileSystemEventHandler
FileSystemEventHandler的子類
創(chuàng)建一個(gè)繼承自FileSystemEventHandler的新類,并根據(jù)用例相應(yīng)地覆蓋這些函數(shù)。我將把它命名為MyHandler,但你可以隨意命名它。
- class MyHandler(FileSystemEventHandler):
- def on_any_event(self, event):
- print(event.event_type, event.src_path)
- def on_created(self, event):
- print("on_created", event.src_path)
- def on_deleted(self, event):
- print("on_deleted", event.src_path)
- def on_modified(self, event):
- print("on_modified", event.src_path)
- def on_moved(self, event):
- print("on_moved", event.src_path)
用實(shí)現(xiàn)的邏輯替換print語(yǔ)句。對(duì)于每個(gè)函數(shù),它都有一個(gè)名為event的輸入?yún)?shù),該參數(shù)包含以下變量:
最有用的參數(shù)是src_path,您可以在其中使用它來(lái)確定哪個(gè)文件被修改,然后再運(yùn)行相應(yīng)的邏輯。
- if(event.src_path == "./path/file.txt"):
- print("Execute your logic here!")
觀察者和事件
一旦你創(chuàng)建了子類,你就可以和觀察者類一起安全地創(chuàng)建它的實(shí)例了。為監(jiān)視過(guò)程分配您所選擇的路徑。我將檢查一個(gè)新創(chuàng)建的名為json的文件夾。您可以根據(jù)自己的喜好修改它。
您也可以設(shè)置recursive遞歸參數(shù),但強(qiáng)烈建議預(yù)先定義層次結(jié)構(gòu)并將其設(shè)置為false,以防止權(quán)限不足或無(wú)法訪問(wèn)子文件夾的問(wèn)題。
調(diào)用start將運(yùn)行該線程,當(dāng)您在相應(yīng)的路徑中進(jìn)行修改時(shí),將生成一個(gè)事件。
- event_handler = MyHandler()
- observer = Observer()
- observer.schedule(event_handler, path='./json/', recursive=False)
- observer.start()
測(cè)試
為了測(cè)試它,你必須實(shí)現(xiàn)一個(gè)正在運(yùn)行的循環(huán)來(lái)防止它退出。退出一個(gè)KeyboardInterrupt異常時(shí),調(diào)用stop函數(shù)來(lái)清理資源。
- while True:
- try:
- pass
- except KeyboardInterrupt:
- observer.stop()
保存Python文件并在終端中運(yùn)行它。根據(jù)您設(shè)置的名稱修改名稱。
- python test.py
您可以通過(guò)創(chuàng)建一個(gè)新文檔、修改其中的內(nèi)容并從目錄中刪除它來(lái)輕松地測(cè)試它。下面是輸出的示例:

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流