1
0
mirror of https://github.com/thingsboard/thingsboard-gateway synced 2025-10-26 22:31:42 +08:00
Files
thingsboard-gateway/thingsboard_gateway/gateway/hot_reloader.py
2022-05-24 11:37:20 +03:00

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])