import os # The decky plugin module is located at decky-loader/plugin # For easy intellisense checkout the decky-loader code repo # and add the `decky-loader/plugin/imports` path to `python.analysis.extraPaths` in `.vscode/settings.json` import pathlib import subprocess import asyncio import os HOME_DIR = str(pathlib.Path(os.getcwd()).parent.parent.resolve()) PARENT_DIR = str(pathlib.Path(__file__).parent.resolve()) LOG_LOCATION = "/tmp/usdpl-template.py.log" # set up logging for Python back-end spawning import logging logging.basicConfig( filename = LOG_LOCATION, format = '%(asctime)s %(levelname)s %(message)s', filemode = 'w', force = True) logger = logging.getLogger() logger.setLevel(logging.DEBUG) logging.info(f"usdpl-decky-template main.py https://git.ngni.us/NG-SD-Plugins/usdpl-decky-plugin-template") class Plugin: backend_proc = None # Asyncio-compatible long-running code, executed in a task when the plugin is loaded async def _main(self): # startup back-end self.backend_proc = subprocess.Popen( [PARENT_DIR + "/bin/backend"], env = dict(os.environ)) while True: # keep running in case Decky checks; very likely unnecessary await asyncio.sleep(1) async def _unload(self): # gracefully stop the back-end, but kill if it doesn't exit quickly enough if self.backend_proc is not None: self.backend_proc.terminate() try: self.backend_proc.wait(timeout=5) # 5 seconds timeout except subprocess.TimeoutExpired: self.backend_proc.kill() self.backend_proc = None