入门

在线试用

直接在浏览器中尝试 REPL 中的 Pyodide(无需安装)。

设置

要将 Pyodide 包含在您的项目中,您可以使用以下 CDN URL:

https://cdn.jsdelivr.net/pyodide/v0.18.1/full/pyodide.js

您还可以从 Github 发行版 下载发行版或自己构建 Pyodide。有关更多详细信息,请参阅 下载和部署 Pyodide

pyodide.js 文件定义了一个名为 loadPyodide 的单异步函数(single async function),它设置 Python 环境并返回 Pyodide 顶级命名空间

async function main() {
  let pyodide = await loadPyodide({ indexURL : "https://cdn.jsdelivr.net/pyodide/v0.18.1/full/" });
  // Pyodide is now ready to use...
  console.log(pyodide.runPython(`
    import sys
    sys.version
  `));
};
main();

运行 Python 代码

Python 代码使用 pyodide.runPython 函数运行。它将一串 Python 代码作为输入。如果代码以表达式结尾,则返回表达式的结果,并转换为 Javascript 对象(请参阅 Type translations)。例如,以下代码将 version 字符串作为 Javascript 字符串返回:

pyodide.runPython(`
  import sys
  sys.version
`);

导入 Pyodide 后,只有标准库中的包可用。有关加载其他包的信息,请参阅 加载包

完整示例

创建并保存一个包含以下内容的测试 index.html 页面:

<!DOCTYPE html>
<html lang="zh">
  <head>
      <script src="https://cdn.jsdelivr.net/pyodide/v0.18.1/full/pyodide.js"></script>
  </head>
  <body>
    Pyodide 测试页 <br>
    打开浏览器控制台查看 Pyodide 输出
    <script type="text/javascript">
      async function main(){
        let pyodide = await loadPyodide({
          indexURL : "https://cdn.jsdelivr.net/pyodide/v0.18.1/full/"
        });
        console.log(pyodide.runPython(`
            import sys
            sys.version
        `));
        console.log(pyodide.runPython("print(1 + 2)"));
      }
      main();
    </script>
  </body>
</html>

可选示例

<!DOCTYPE html>
<html lang="zh">
  <head>
    <script src="https://cdn.jsdelivr.net/pyodide/v0.18.1/full/pyodide.js"></script>
  </head>

  <body>
    <p>
      您可以执行任何 Python 代码。只需在下面的框中输入内容,然后单击按钮。
    </p>
    <input id="code" value="sum([1, 2, 3, 4, 5])" />
    <button onclick="evaluatePython()">运行</button>
    <br />
    <br />
    <div>输出:</div>
    <textarea id="output" style="width: 100%;" rows="6" disabled></textarea>

    <script>
      const output = document.getElementById("output");
      const code = document.getElementById("code");

      function addToOutput(s) {
        output.value += ">>>" + code.value + "\n" + s + "\n";
      }

      output.value = "正在初始化...\n";
      // init Pyodide
      async function main() {
        let pyodide = await loadPyodide({
          indexURL: "https://cdn.jsdelivr.net/pyodide/v0.18.1/full/",
        });
        output.value += "准备好!\n";
        return pyodide;
      }
      let pyodideReadyPromise = main();

      async function evaluatePython() {
        let pyodide = await pyodideReadyPromise;
        try {
          let output = pyodide.runPython(code.value);
          addToOutput(output);
        } catch (err) {
          addToOutput(err);
        }
      }
    </script>
  </body>
</html>

从 Javascript 访问 Python 域

您还可以使用 pyodide.globals 对象从 Javascript 访问 Python 中定义的所有函数和变量。

例如,如果您在 Python 中运行代码 x = numpy.ones([3,3]),您可以在浏览器的开发人员控制台中从 Javascript 以 pyodide.globals.get("x") 的形式访问变量 x。函数和导入也是如此。有关更多详细信息,请参阅 Type translations

您可以在浏览器控制台中自行尝试:

pyodide.runPython(`
  import numpy
  x=numpy.ones((3, 4))
`);
pyodide.globals.get('x').toJs();
// >>> [ Float64Array(4), Float64Array(4), Float64Array(4) ]

// create the same 3x4 ndarray from js
x = pyodide.globals.get('numpy').ones(new Int32Array([3, 4])).toJs();
// x >>> [ Float64Array(4), Float64Array(4), Float64Array(4) ]

由于您可以完全访问 Python 全局域,您还可以将新值甚至 Javascript 函数重新分配给变量,并从 Javascript 创建新的:

// re-assign a new value to an existing variable
pyodide.globals.set("x", 'x will be now string');

// create a new js function that will be available from Python
// this will show a browser alert if the function is called from Python
pyodide.globals.set("alert", alert);

// this new function will also be available in Python and will return the squared value.
pyodide.globals.set("square", x => x*x);

// You can test your new Python function in the console by running
pyodide.runPython("square(3)");

随意使用浏览器控制台和上面的示例来处理代码。

从 Python 访问 Javascript 域

可以使用 js 模块从 Python 访问 Javascript 范围(请参阅将 Importing Javascript objects into Python)。该模块代表全局对象 window,允许我们直接操作 DOM 并从 Python 访问全局变量和函数。

import js

div = js.document.createElement("div")
div.innerHTML = "<h1>This element was created from Python</h1>"
js.document.body.prepend(div)

请参阅 提供 Pyodide 包 以在本地分发 Pyodide 文件。