import io, os, shutil, subprocess, urllib.request, zipfile from pathlib import Path REPO_ZIP = "https://codeload.github.com/egor19saz/csharp-notebook/zip/refs/heads/main" HOME = Path.home() DOTNET_DIR = HOME / ".dotnet" DOTNET = DOTNET_DIR / "dotnet" SRC = HOME / "notebook-src" APP = HOME / "notebook-app" def run(*args, **kw): print("+", " ".join(map(str, args)), flush=True) subprocess.run([str(a) for a in args], check=True, **kw) if not DOTNET.exists(): urllib.request.urlretrieve("https://dot.net/v1/dotnet-install.sh", "/tmp/dotnet-install.sh") run("bash", "/tmp/dotnet-install.sh", "--channel", "8.0", "--install-dir", DOTNET_DIR) env = dict(os.environ, DOTNET_ROOT=str(DOTNET_DIR), PATH=f"{DOTNET_DIR}:{os.environ.get('PATH', '')}", DOTNET_CLI_TELEMETRY_OPTOUT="1", DOTNET_NOLOGO="1", DOTNET_SKIP_FIRST_TIME_EXPERIENCE="1") shutil.rmtree(SRC, ignore_errors=True) zipfile.ZipFile(io.BytesIO(urllib.request.urlopen(REPO_ZIP).read())).extractall(SRC) project = next(SRC.iterdir()) / "CSharpNotebook.csproj" run(DOTNET, "publish", project, "-c", "Release", "-o", APP, env=env) env["Urls"] = "http://0.0.0.0:7860" os.chdir(APP) os.execve(str(DOTNET), [str(DOTNET), "CSharpNotebook.dll"], env)