import requests import zipfile import importlib.util import os import shutil from datetime import datetime import subprocess REMOTE_CODE_URL = os.environ.get("api_url") def download_zip(remote_url, local_zipfile): response = requests.get(remote_url, stream=True) if response.status_code == 200: with open(local_zipfile, "wb") as f: for chunk in response.iter_content(chunk_size=8192): if chunk: f.write(chunk) else: raise Exception(f"Failed to download ZIP file, status code: {response.status_code}") def unzip_file(local_zipfile, extract_dir): if not os.path.exists(extract_dir): os.makedirs(extract_dir, exist_ok=True) with zipfile.ZipFile(local_zipfile, "r") as zip_ref: zip_ref.extractall(extract_dir) def find_py_file(extract_dir): py_files = [] for root, dirs, files in os.walk(extract_dir): for file in files: if file.lower().endswith(".py"): py_files.append(os.path.join(root, file)) if len(py_files) == 0: raise FileNotFoundError("No .py file found in the extracted directory.") elif len(py_files) > 1: raise RuntimeError("Multiple .py files found in the ZIP package.") else: return py_files[0] def execute_py_file(py_file_path): spec = importlib.util.spec_from_file_location("dynamic_module", py_file_path) dynamic_module = importlib.util.module_from_spec(spec) spec.loader.exec_module(dynamic_module) if hasattr(dynamic_module, "build_app"): app = dynamic_module.build_app() app.launch() else: subprocess.run(["python", py_file_path], check=True) def main(): timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") local_zipfile = f"downloaded_app_{timestamp}.zip" extract_dir = f"extracted_code_{timestamp}" try: download_zip(REMOTE_CODE_URL, local_zipfile) unzip_file(local_zipfile, extract_dir) py_file_path = find_py_file(extract_dir) execute_py_file(py_file_path) finally: if os.path.exists(local_zipfile): os.remove(local_zipfile) if os.path.exists(extract_dir): shutil.rmtree(extract_dir) if __name__ == "__main__": main()