YutaHikida's picture
Run private app from downloaded repository root
8bf787a
Raw History Blame Contribute Delete
1.74 kB
import os
import sys
import importlib.util
from tempfile import TemporaryDirectory
from huggingface_hub import HfApi
def load_private_code():
token = os.environ["PRIVATE_REPOSITORY_HF_TOKEN"]
api = HfApi(token=token)
tmp_dir = TemporaryDirectory() # with で閉じると DL 済みファイルが消えるので保持する
api.snapshot_download(
repo_id="neoai-inc-private/pj-lynx",
repo_type="space",
local_dir=tmp_dir.name,
)
# private 側のコードは data/ などをリポジトリルートからの相対パスで参照する。
os.chdir(tmp_dir.name)
sys.path.insert(0, tmp_dir.name)
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()
APP_PASSWORD = os.environ["APP_PASSWORD"]
demo = private_app.demo # pj-lynx の Gradio オブジェクトは `demo`
demo.queue(default_concurrency_limit=10)
demo.launch(
# ユーザー名は無視し、パスワードだけで判定する(ユーザー名欄は空でOK)
auth=lambda username, password: password == APP_PASSWORD,
auth_message="パスワードを入力してください(ユーザー名は空欄で可)",
ssr_mode=False,
)