diff --git a/pyscriptjs/src/components/pyenv.ts b/pyscriptjs/src/components/pyenv.ts index e12d6f5..f67b808 100644 --- a/pyscriptjs/src/components/pyenv.ts +++ b/pyscriptjs/src/components/pyenv.ts @@ -1,7 +1,7 @@ import * as jsyaml from 'js-yaml'; import { pyodideLoaded, loadedEnvironments, mode, addInitializer } from '../stores'; -import { loadPackage } from '../interpreter'; +import { loadPackage, loadFromFile } from '../interpreter'; // Premise used to connect to the first available pyodide interpreter let pyodideReadyPromise; @@ -37,13 +37,36 @@ export class PyEnv extends HTMLElement { this.code = this.innerHTML; this.innerHTML = ''; - let env = this.environment = jsyaml.load(this.code); + let env = []; + let paths = []; + this.environment = jsyaml.load(this.code); + for (let entry of this.environment) { + if (typeof entry == "string" ){ + env.push(entry); + } + else if (entry.hasOwnProperty('paths')){ + for (let path of entry.paths) { + paths.push(path); + } + } + } + async function loadEnv() { let pyodide = await pyodideReadyPromise; await loadPackage(env, pyodide); console.log("enviroment loaded") } + + async function loadPaths() { + let pyodide = await pyodideReadyPromise; + for (let singleFile of paths) { + await loadFromFile(singleFile, pyodide); + } + console.log("paths loaded") + } addInitializer(loadEnv); + addInitializer(loadPaths); console.log("enviroment loading...", env) + } } diff --git a/pyscriptjs/src/interpreter.ts b/pyscriptjs/src/interpreter.ts index 8578f85..44d77d5 100644 --- a/pyscriptjs/src/interpreter.ts +++ b/pyscriptjs/src/interpreter.ts @@ -1,3 +1,5 @@ +import { getLastPath } from "./utils"; + // @ts-nocheck // @ts-ignore let pyodideReadyPromise; @@ -129,4 +131,19 @@ let loadPackage = async function(package_name: string[] | string, runtime: any): await runtime.loadPackage(package_name); } -export {loadInterpreter, pyodideReadyPromise, loadPackage} +let loadFromFile = async function(s: string, runtime: any): Promise { + let filename = getLastPath(s); + await runtime.runPythonAsync(` + from pyodide.http import pyfetch + from pyodide import eval_code + response = await pyfetch("`+s+`") + content = await response.bytes() + + with open("`+filename+`", "wb") as f: + f.write(content) + `) + + runtime.pyimport(filename.replace(".py", "")); +} + +export {loadInterpreter, pyodideReadyPromise, loadPackage, loadFromFile} diff --git a/pyscriptjs/src/utils.ts b/pyscriptjs/src/utils.ts index 624b8c9..1f66ac3 100644 --- a/pyscriptjs/src/utils.ts +++ b/pyscriptjs/src/utils.ts @@ -1,6 +1,12 @@ -export function addClasses(element: HTMLElement, classes: Array){ +function addClasses(element: HTMLElement, classes: Array){ for (let entry of classes) { element.classList.add(entry); } } + +const getLastPath = function (str) { + return str.split('\\').pop().split('/').pop(); +} + +export {addClasses, getLastPath} \ No newline at end of file