1
0
mirror of https://github.com/pyscript/pyscript.git synced 2022-05-01 19:47:48 +03:00

change OutputManager to actually have separate contexts for out and err to scripts can manage both in one place

This commit is contained in:
Fabio Pliger
2022-04-18 15:54:59 -05:00
parent 4d890602d9
commit 00b571d3df
2 changed files with 42 additions and 14 deletions

View File

@@ -115,9 +115,11 @@ export class BaseEvalElement extends HTMLElement {
await this._register_esm(pyodide);
if (source.includes("asyncio")){
await pyodide.runPythonAsync(`output_manager.change("`+this.outputElement.id+`")`);
output = await pyodide.runPythonAsync(source);
await pyodide.runPythonAsync(`output_manager.revert()`)
}else{
output = pyodide.runPython(`output_manager.change("`+this.outputElement.id+`")`);
output = pyodide.runPython(source);
pyodide.runPython(`output_manager.revert()`)
}

View File

@@ -95,31 +95,57 @@ class Element:
return Element(clone.id, clone)
class OutputManager:
def __init__(self, custom=None, output_to_console=True):
self._custom = custom
self._prev = custom
class OutputCtxManager:
def __init__(self, out=None, output_to_console=True, append=True):
self._out = out
self._prev = out
self.output_to_console = output_to_console
self.prev = None
self._append = append
def change(self, custom):
self._prev = self._custom
self._custom = custom
console.log("----> changed to", self._custom)
def change(self, out=None, err=None, output_to_console=True, append=True):
self._prevt = self._out
self._out = out
self.output_to_console = output_to_console
self._append = append
console.log("----> changed out to", self._out, self._append)
def revert(self):
console.log("----> reverted")
self._custom = self._prev
self._out = self._prev
def write(self, txt):
if self._custom:
pyscript.write(self._custom, txt, append=True)
console.log('writing to', self._out, txt, self._append)
if self._out:
pyscript.write(self._out, txt, append=self._append)
if self.output_to_console:
console.log(self._custom, txt)
console.log(self._out, txt)
class OutputManager:
def __init__(self, out=None, err=None, output_to_console=True, append=True):
sys.stdout = self._out_manager = OutputCtxManager(out, output_to_console, append)
sys.strerr = self._err_manager = OutputCtxManager(err, output_to_console, append)
self.output_to_console = output_to_console
self._append = append
def change(self, out=None, err=None, output_to_console=True, append=True):
self._out_manager.change(out, output_to_console, append)
sys.stdout = self._out_manager
self._err_manager.change(err, output_to_console, append)
sys.stderr = self._err_manager
self.output_to_console = output_to_console
self.append = append
def revert(self):
self._out_manager.revert()
self._err_manager.revert()
sys.stdout = self._out_manager
sys.stdout = self._err_manager
console.log("----> reverted")
pyscript = PyScript()
output_manager = OutputManager()
sys.stdout = output_manager
`
let loadInterpreter = async function(): Promise<any> {