python:pyodide

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
python:pyodide [2022/10/11 10:25] – [インストール] ともやんpython:pyodide [2022/10/12 07:15] (現在) ともやん
行 2: 行 2:
   <script src="https://www.tomoyan.net/_media/javascript/jquery/terminal/jquery.terminal-2.7.1.min.js?cache=recache"></script>   <script src="https://www.tomoyan.net/_media/javascript/jquery/terminal/jquery.terminal-2.7.1.min.js?cache=recache"></script>
   <link href="https://www.tomoyan.net/_media/javascript/jquery/terminal/jquery.terminal-2.7.1.css?cache=recache" rel="stylesheet"/>   <link href="https://www.tomoyan.net/_media/javascript/jquery/terminal/jquery.terminal-2.7.1.css?cache=recache" rel="stylesheet"/>
-  <link href="/_media/python/pyodide/0.14.3/renderedhtml.css?cache=recache" rel="stylesheet"/>+  <!--<link href="/_media/python/pyodide/0.22.0a1/renderedhtml.css?cache=recache" rel="stylesheet"/>-->
   <style>   <style>
     #terminal {     #terminal {
行 15: 行 15:
   <script>   <script>
     self.startTime = new Date();     self.startTime = new Date();
-    self.languagePluginUrl = '/_media/python/pyodide/0.14.3/';+    /*self.languagePluginUrl = '/_media/python/pyodide/0.22.0a1/';*/
   </script>   </script>
-  <script src="/_media/python/pyodide/0.14.3/pyodide_dev.js?cache=-1"></script>+  <script src="/_media/python/pyodide/0.22.0a1/pyodide.js?cache=-1"></script>
   <script>   <script>
-    jQuery(function() {+    "use strict"; 
 +    function sleep(s) { 
 +      return new Promise((resolve) => setTimeout(resolve, s)); 
 +    } 
 + 
 +    async function main() { 
 +      let term; 
 +      globalThis.pyodide = await loadPyodide({ 
 +        stdin: () => { 
 +          let result = prompt(); 
 +          echo(result); 
 +          return result; 
 +        }, 
 +      }); 
 +      let namespace = pyodide.globals.get("dict")(); 
 +      pyodide.runPython( 
 +        ` 
 +          import sys 
 +          import pyodide 
 +          from pyodide.ffi import to_js 
 +          from pyodide.console import PyodideConsole, repr_shorten, BANNER 
 +          import __main__ 
 +          BANNER = "Welcome to the Pyodide terminal emulator 🐍 Version " + pyodide.__version__ + "\\n" + BANNER 
 +          pyconsole = PyodideConsole(__main__.__dict__) 
 +          import builtins 
 +          async def await_fut(fut): 
 +            res = await fut 
 +            if res is not None: 
 +              builtins._ = res 
 +            return to_js([res], depth=1) 
 +          def clear_console(): 
 +            pyconsole.buffer = [] 
 +        `, 
 +        { globals: namespace }, 
 +      ); 
 +      let repr_shorten = namespace.get("repr_shorten"); 
 +      let banner = namespace.get("BANNER"); 
 +      let await_fut = namespace.get("await_fut"); 
 +      let pyconsole = namespace.get("pyconsole"); 
 +      let clear_console = namespace.get("clear_console"); 
 +      const echo = (msg, ...opts) => 
 +      term.echo( 
 +        msg 
 +        .replaceAll("]]", "&rsqb;&rsqb;"
 +        .replaceAll("[[", "&lsqb;&lsqb;"), 
 +        ...opts, 
 +      ); 
 +      namespace.destroy(); 
 + 
 +      let ps1 = ">>> ", 
 +          ps2 = "... "; 
 + 
 +      async function lock() { 
 +        let resolve; 
 +        let ready = term.ready; 
 +        term.ready = new Promise((res) => (resolve = res)); 
 +        await ready; 
 +        return resolve; 
 +      } 
 + 
 +      async function interpreter(command) { 
 +        let unlock = await lock(); 
 +        term.pause(); 
 +        // multiline should be split (useful when pasting) 
 +        for (const c of command.split("\n")) { 
 +          let fut = pyconsole.push(c); 
 +          term.set_prompt(fut.syntax_check === "incomplete" ? ps2 : ps1); 
 +          switch (fut.syntax_check) { 
 +            case "syntax-error": 
 +              term.error(fut.formatted_error.trimEnd()); 
 +              continue; 
 +            case "incomplete": 
 +              continue; 
 +            case "complete": 
 +              break; 
 +            default: 
 +              throw new Error(`Unexpected type ${ty}`); 
 +          } 
 +          // In JavaScript, await automatically also awaits any results of 
 +          // awaits, so if an async function returns a future, it will await 
 +          // the inner future too. This is not what we want so we 
 +          // temporarily put it into a list to protect it. 
 +          let wrapped = await_fut(fut); 
 +          // complete case, get result / error and print it. 
 +          try { 
 +            let [value] = await wrapped; 
 +            if (value !== undefined) { 
 +              echo( 
 +                repr_shorten.callKwargs(value,
 +                  separator: "\n<long output truncated>\n", 
 +                }), 
 +              ); 
 +            } 
 +            if (pyodide.isPyProxy(value)) { 
 +              value.destroy(); 
 +            } 
 +          } catch (e) { 
 +            if (e.constructor.name === "PythonError") { 
 +              const message = fut.formatted_error || e.message; 
 +              term.error(message.trimEnd()); 
 +            } else { 
 +              throw e; 
 +            } 
 +          } finally { 
 +            fut.destroy(); 
 +            wrapped.destroy(); 
 +          } 
 +        } 
 +        term.resume(); 
 +        await sleep(10); 
 +        unlock(); 
 +      } 
 + 
 +      term = jQuery("#terminal"); 
 +      term.text(''); //term.clear() 
 +      self.endTime = new Date(); 
 +      var ms = self.endTime.getTime() - self.startTime.getTime(); 
 +      banner = "Interpreter Loading time: " + ms + "ms\n" + banner; 
 +      term.terminal(interpreter,
 +        greetings: banner, 
 +        prompt: ps1, 
 +        completionEscape: false, 
 +        completion: function (command, callback) { 
 +          callback(pyconsole.complete(command).toJs()[0]); 
 +        }, 
 +        keymap: { 
 +          "CTRL+C": async function (event, original) { 
 +            clear_console(); 
 +            term.enter(); 
 +            echo("KeyboardInterrupt"); 
 +            term.set_command(""); 
 +            term.set_prompt(ps1); 
 +          }, 
 +          TAB: (event, original) => { 
 +            const command = term.before_cursor(); 
 +            // Disable completion for whitespaces. 
 +            if (command.trim() === "") { 
 +              term.insert("\t"); 
 +              return false; 
 +            } 
 +            return original(event); 
 +          }, 
 +        }, 
 +      }); 
 +      window.term = term; 
 +      pyconsole.stdout_callback = (s) => echo(s, { newline: false }); 
 +      pyconsole.stderr_callback = (s) => { 
 +        term.error(s.trimEnd()); 
 +      }; 
 +      term.ready = Promise.resolve(); 
 +      pyodide._api.on_fatal = async (e) => { 
 +        term.error( 
 +          "Pyodide has suffered a fatal error. Please report this to the Pyodide maintainers.", 
 +        ); 
 +        term.error("The cause of the fatal error was:"); 
 +        term.error(e); 
 +        term.error("Look in the browser console for more details."); 
 +        await term.ready; 
 +        term.pause(); 
 +        await sleep(15); 
 +        term.pause(); 
 +      }; 
 + 
 +      const searchParams = new URLSearchParams(window.location.search); 
 +      if (searchParams.has("noblink")) { 
 +        $(".cmd-cursor").addClass("noblink"); 
 +      } 
 +    } 
 +    window.console_ready = main(); 
 +    /*jQuery(function() {
       languagePluginLoader.then(() => {       languagePluginLoader.then(() => {
         function pushCode(line) {         function pushCode(line) {
行 90: 行 259:
         }         }
       });       });
-    });+    });*/
   </script>   </script>
 </html> </html>
行 108: 行 277:
 >>> import sys >>> import sys
 >>> sys.version >>> sys.version
-3.7.(defaultDec 11 201912:37:21 +'3.10.(mainSep 25 202205:41:13) [Clang 16.0.0 (https://github.com/llvm/llvm-project a4a29438f451370ed241dde30bfc'
-[Clang 6.0.1 ]+
 >>> sys.version_info >>> sys.version_info
-3,7,0,final,0+sys.version_info(major=3, minor=10micro=2releaselevel='final'serial=0)
 >>> import platform >>> import platform
 >>> platform.system() >>> platform.system()
-Emscripten+'Emscripten'
 >>> platform.platform() >>> platform.platform()
-Emscripten-1.0-x86-JS-32bit+'Emscripten-3.1.21-wasm32-32bit'
 >>> >>>
 </code> </code>
  • python/pyodide.txt
  • 最終更新: 2022/10/12 07:15
  • by ともやん