mirror of
https://github.com/thingsboard/thingsboard-gateway
synced 2025-10-26 22:31:42 +08:00
63 lines
1.9 KiB
Python
63 lines
1.9 KiB
Python
import os
|
|
import inspect
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
from time import time, sleep
|
|
|
|
|
|
class HotReloader:
|
|
def __init__(self, function):
|
|
self._stopped = False
|
|
self._file_pattern = r'^(?!.*.(pyc|log|\d)$).*$'
|
|
self._exclude_files = [
|
|
'connected_devices.json',
|
|
'persistent_keys.json'
|
|
]
|
|
self._runnable_function = function
|
|
self._poll_interval = 1
|
|
self._process = None
|
|
|
|
self._runnable_function_path = os.path.abspath(inspect.getfile(self._runnable_function))
|
|
self._root_path = '/'.join(os.path.abspath(inspect.getfile(self._runnable_function)).split('/')[:-2])
|
|
self._files = self._find_files()
|
|
|
|
self._last_poll_time = 0
|
|
|
|
self.run()
|
|
|
|
def _find_files(self):
|
|
files = []
|
|
for root, _, filenames in os.walk(self._root_path):
|
|
for filename in filenames:
|
|
if re.match(self._file_pattern, filename) and filename not in self._exclude_files:
|
|
file_path = os.path.join(root, filename)
|
|
files.append((file_path, os.stat(file_path).st_mtime))
|
|
|
|
return files
|
|
|
|
def run(self):
|
|
try:
|
|
self.execute()
|
|
|
|
while not self._stopped:
|
|
if time() - self._last_poll_time >= self._poll_interval:
|
|
files = self._find_files()
|
|
if files != self._files:
|
|
print('Reloading....')
|
|
self.execute()
|
|
self._files = files
|
|
|
|
self._last_poll_time = time()
|
|
|
|
sleep(.2)
|
|
except KeyboardInterrupt:
|
|
self._stopped = True
|
|
|
|
def execute(self):
|
|
if self._process is not None:
|
|
self._process.kill()
|
|
self._process.wait()
|
|
|
|
self._process = subprocess.Popen([sys.executable, self._runnable_function_path])
|