Hi,
I like how in streamlit it can automatically display the list of python files in a pages
directory and show them in the sidebar, including newly added pages and automatically remove deleted pages.
So far what I have come up is by automatically restarting the server using the script below when new files are added or removed from the directory. Is there an easier way to do this?
import argparse
import time
from datetime import datetime
import panel.io.server # enable bokeh server patch
from panel.command.serve import Serve
from path import Path
from watchdog.events import FileCreatedEvent, FileDeletedEvent, FileSystemEventHandler
from watchdog.observers import Observer
restart = False
class ServeCmd(Serve):
def customize_server(self, server):
self.__server = server
return server
def stop(self):
loop = self.__server.io_loop
loop.add_callback(loop.stop)
self.__server.unlisten()
class EventHandler(FileSystemEventHandler):
def __init__(self):
self._last_event_time = None
def _check_time(self):
t = datetime.now().timestamp()
if self._last_event_time is not None and (t - self._last_event_time) < 2:
print('skipped')
return False
self._last_event_time = t
return True
def _restart(self):
global cmd, restart
if self._check_time():
time.sleep(1)
restart = True
cmd.stop()
def on_created(self, event):
if isinstance(event, FileCreatedEvent):
print('on_created')
self._restart()
def on_deleted(self, event):
global cmd, restart
if isinstance(event, FileDeletedEvent):
print('on_deleted')
self._restart()
observer = Observer()
handler = EventHandler()
observer.schedule(handler, 'pages')
observer.start()
while True:
parser = argparse.ArgumentParser()
cmd = ServeCmd(parser=parser)
files = Path('pages').files('*.py')
args = parser.parse_args(['--autoreload'] + files)
cmd.invoke(args)
if not restart:
break
restart = False