import os import sys import importlib.util import subprocess from tempfile import TemporaryDirectory from huggingface_hub import HfApi def load_private_code(): token = os.environ["PRIVATE_REPOSITORY_HF_TOKEN"] # private library が必要な場合のみ(pj-lynx の app 起動には不要なので通常はスキップ) private_library_url = os.environ.get("PRIVATE_LIBRARY_URL", "") if private_library_url: try: subprocess.run( ["pip", "install", f"git+https://{token}@{private_library_url}"], check=True, ) except subprocess.CalledProcessError as e: print("Error installing private module:", e) api = HfApi(token=token) # TemporaryDirectory を with で閉じると消えるので、閉じずに保持する tmp_dir = TemporaryDirectory() api.snapshot_download( repo_id="neoai-inc-private/pj-lynx", repo_type="space", local_dir=tmp_dir.name, ) sys.path.insert(0, tmp_dir.name) # DL先を最優先で import 解決 spec = importlib.util.spec_from_file_location( "private_app", os.path.join(tmp_dir.name, "app.py"), ) private_module = importlib.util.module_from_spec(spec) sys.modules["private_app"] = private_module try: spec.loader.exec_module(private_module) except ModuleNotFoundError as e: print(f"Error loading module: {e}") print(f"Current sys.path: {sys.path}") print(f"Contents of tmp_dir: {os.listdir(tmp_dir.name)}") raise private_module._tmp_dir = tmp_dir # GC で消えないよう参照を残す return private_module private_app = load_private_code() # pj-lynx 側の Gradio オブジェクトは `demo`(元雛形の `app` ではない) demo = private_app.demo demo.queue(default_concurrency_limit=10) demo.launch( auth=(os.environ["APP_USERNAME"], os.environ["APP_PASSWORD"]), ssr_mode=False, )