From 12076b8784bab8be27cce4c7b18a43173921a883 Mon Sep 17 00:00:00 2001 From: QuantumEnergyE Date: Sat, 22 Dec 2018 23:25:54 +0800 Subject: [PATCH] Use scandir to save memory --- src/watchdog/observers/polling.py | 7 ++++++- src/watchdog/utils/dirsnapshot.py | 9 +++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/watchdog/observers/polling.py b/src/watchdog/observers/polling.py index 4ad502c48..1ac348bc4 100644 --- a/src/watchdog/observers/polling.py +++ b/src/watchdog/observers/polling.py @@ -58,6 +58,11 @@ FileModifiedEvent ) +try: + from os import scandir +except ImportError: + from os import listdir as scandir + class PollingEmitter(EventEmitter): """ @@ -66,7 +71,7 @@ class PollingEmitter(EventEmitter): """ def __init__(self, event_queue, watch, timeout=DEFAULT_EMITTER_TIMEOUT, - stat=default_stat, listdir=os.listdir): + stat=default_stat, listdir=scandir): EventEmitter.__init__(self, event_queue, watch, timeout) self._snapshot = None self._lock = threading.Lock() diff --git a/src/watchdog/utils/dirsnapshot.py b/src/watchdog/utils/dirsnapshot.py index af54c9aab..cb8483ae3 100644 --- a/src/watchdog/utils/dirsnapshot.py +++ b/src/watchdog/utils/dirsnapshot.py @@ -48,6 +48,10 @@ import os from stat import S_ISDIR from watchdog.utils import stat as default_stat +try: + from os import scandir +except ImportError: + from os import listdir as scandir class DirectorySnapshotDiff(object): @@ -199,7 +203,7 @@ class DirectorySnapshot(object): def __init__(self, path, recursive=True, walker_callback=(lambda p, s: None), stat=default_stat, - listdir=os.listdir): + listdir=scandir): self._stat_info = {} self._inode_to_path = {} @@ -209,7 +213,8 @@ def __init__(self, path, recursive=True, def walk(root): try: - paths = [os.path.join(root, name) for name in listdir(root)] + paths = [os.path.join(root, entry if isinstance(entry, str) else entry.name) + for entry in listdir(root)] except OSError as e: # Directory may have been deleted between finding it in the directory # list of its parent and trying to delete its contents. If this