如何使用 pyodide 在项目中导入模块而不出现错误?

2023-12-03

每当我在 pyodide 中导入 python 模块时,都会出现此错误。

pyodide.js:108 Invalid package name or URI

我不确定如何正确导入模块, 我已经尝试过文档中提到的这个。

pyodide.loadPackage('<module address>')    

(这返回了一个承诺,我在其革命上运行此方法)

pyodide.runPython('
                   <python code here>
                ')

执行后,我收到上述错误。

JavaScript 代码:

<html>
  <head>
      <script type="text/javascript">
          // set the pyodide files URL (packages.json, pyodide.asm.data etc)
          window.languagePluginUrl = 'https://pyodide-cdn2.iodide.io/v0.15.0/full/';
      </script>
      <script src="https://pyodide-cdn2.iodide.io/v0.15.0/full/pyodide.js"></script>
  </head>
  <body>
    Pyodide test page <br>
    Open your browser console to see pyodide output
    <script type="text/javascript">
          languagePluginLoader.then(function () {
            pyodide.loadPackage('<address>').then(() => {
                    console.log(pyodide.runPython('
                    import sys
                    from <my package> import *
                    sys.version
                '));
                console.log(pyodide.runPython('print(1 + 2)'));
            });
            
          });
    </script>
  </body>
</html>

这个问题可能不清楚,但如果您无法理解某些内容,请告诉我。

另外,传入的字符串runPython()method是python代码,只是为了避免混淆。

我什至尝试将模块上传到服务器,因为文档提到了使用 HTTP 协议的 URL,这种尝试非常愚蠢,但我还是这么做了。

Docs: https://pyodide.readthedocs.io/en/latest/using_pyodide_from_javascript.html#loading-packages


更新:Pyodide v0.21.0

从 Pyodide 0.18.0 开始,异步运行Python不会自动加载包,所以从导入加载包应该提前打电话。

因此,要导入第三方包,例如numpy我们有两个选择:我们可以手动预加载所需的包,然后在 Python 中导入它们

// JS

await pyodide.loadPackage('numpy');
// numpy is now available
pyodide.runPython('import numpy as np')
console.log(pyodide.runPython('np.ones((3, 3)))').toJs())

或者我们可以使用从导入加载包函数将自动下载代码片段导入的所有包:

// JS
let python_code = `
import numpy as np
np.ones((3,3))
`
(async () => { // enable await
  await pyodide.loadPackagesFromImports(python_code)
  let result = await pyodide.runPythonAsync(python_code)
  console.log(result.toJs())
})() // call the function immediately

可以找到更多示例here

(async () => { // enable await
  let python_code = `
import numpy as np
np.ones((3,3))
`
  let pyodide = await loadPyodide();
  await pyodide.loadPackagesFromImports(python_code)
  console.log(pyodide.runPython(python_code).toJs())
})() // call the function immediately
<script src="https://pyodide-cdn2.iodide.io/v0.21.0/full/pyodide.js"></script>

另请注意,从版本 0.17 开始,Pyodide 对非 JS 数据类型使用 JsProxy。因此,在打印结果之前,必须使用进行转换toJs.


旧答案(与 Pyodide v0.15.0 相关)

目前尚不清楚你传递的是什么<address> in pyodide.loadPackage('<address>'),但它应该只是包名称(例如numpy).

另请注意,Pyodide 目前支持的软件包数量有限。看看这个tutorial了解更多详细信息。

如果你想导入第三方包,例如numpy有两种选择:您可以手动预加载所需的包,然后使用Python将它们导入pyodide.loadPackage and pyodide.runPython功能:

pyodide.loadPackage('numpy').then(() => {
  // numpy is now available
  pyodide.runPython('import numpy as np')
  console.log(pyodide.runPython('np.ones((3, 3)))'))
})

或者你可以使用pyodide.runPythonAsync函数将自动下载代码片段导入的所有包。

这是最小的例子pyodide.runPythonAsync

let python_code = `
import numpy as np
np.ones((3,3))
`
// init environment, then run python code
languagePluginLoader.then(() => {
    pyodide.runPythonAsync(python_code).then(output => alert(output))
})
<script type="text/javascript">
    // Default Pyodide files URL ('packages.json', 'pyodide.asm.data', etc.)
    window.languagePluginUrl = 'https://cdn.jsdelivr.net/pyodide//v0.15.0/full/';
</script>
<script src="https://cdn.jsdelivr.net/pyodide/v0.15.0/full/pyodide.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 pyodide 在项目中导入模块而不出现错误? 的相关文章

  • python matplotlib 使用按钮事件添加和删除图形中的文本

    我试图在调用button press event 时将文本添加到鼠标指针位置的图形中 并在调用button release event 时将其删除 我已成功添加文本 但无法将其删除 这是我使用的代码的一部分 def onclick even
  • 如何禁用向左滚动?

    I got a div 元素 parent 包含多个子元素 item 我想启用滚动父元素一个方向 left OR正确的 否则什么都不会发生 看我的代码 parent scroll function gt gt gt scroll event
  • Django - 该进程无法访问该文件,因为该文件正在被另一个进程使用

    我正在尝试在 Windows 10 上运行 Django 我是 Django 的新手 我正在使用 Compressor Toolkit 我的问题是 我可以运行 manage py 但本地主机说 base html 第 9 行出错该进程无法访
  • 使用 jQuery animate 时,有没有办法隐藏 webkit 浏览器中显示的工件?

    我正在使用 jQuery animate 在网页上的项目中滑动 由于某种原因 只有在 webkit 浏览器中 元素动画的空间中才会出现伪影痕迹 有没有办法阻止或隐藏这种情况 一旦您加载此处的页面 它们就会出现在轮播上 http www my
  • Tkinter 按钮鼠标右键和左键单击有不同的命令

    我正在用 Python 制作扫雷游戏 并使用 tkinter 库来创建 gui 有没有 绑定到 tkinter 按钮两个命令的方法 一个是右键单击按钮时的命令 另一个是单击左键时的命令 通常 按钮仅设计用于单击 但 tkinter 允许您为
  • 在浏览器中打开的 .mhtml 文件中填写输入

    我想对 mhtml 文件运行 e2e 测试 即填写表格 在 mhtml 文件上查看和提取数据效果非常好 但我无法填写任何内容input字段 既不是手动也不是通过木偶操作者 你可以用这个试试 mhtml 文件 https gist githu
  • 将 Selenium 与 PyCharm CE 结合使用

    我正在尝试将 Selenium 与 PyCharm CE 一起使用 我已经使用 pip install Selenium 安装了 Selenium 并且可以通过终端使用它 但是当我尝试将它与 PyCharm 一起使用时 出现导入错误 Imp
  • 如何在Python中获取套接字的外部IP?

    当我打电话时socket getsockname 在套接字对象上 它返回我的机器的内部 IP 和端口的元组 但是 我想找回我的外部IP 最便宜 最有效的方式是什么 如果没有外部服务器的配合 这是不可能的 因为您和另一台计算机之间可能存在任意
  • 在 grpc python 中处理异步流请求

    我试图了解如何使用双向流处理 grpc api 使用 Python API 假设我有以下简单的服务器定义 syntax proto3 package simple service TestService rpc Translate stre
  • Google App Engine self.redirect() POST 方法

    在 GAE Python 中 使用 webApp 框架 调用 self redirect some url 通过 GET 方法将用户重定向到该 URL 是否也可以通过带有一些参数的 POST 方法进行 重定向 如果可以的话 怎样做 Than
  • 原型链、构造函数、继承

    我正在玩 javascript 原型 我是新手 所以我有一个小问题 我正在用这个article http mckoss com jscript object htm作为指导 我已经定义了产品和书籍 目的是什么Book prototype c
  • django 南迁移,不设置默认值

    我使用 South 来迁移我的 Django 模型 然而 南方有一个令人讨厌的错误 它不会在 Postgres 数据库中设置默认值 例子 created at models DateTimeField default datetime no
  • 图像未显示在从 HTML 创建的 PDF 上

    我想动态创建 PDF 这意味着我将从 Google Drive 获取文件 然后将它们放入 HTML 代码中 并尝试从中创建 PDF 一切工作正常 除了图像没有显示 我现在正在做的是 从 HTML 字符串创建 HtmlOutput 获取该 H
  • 使用条件在 pandas 数据框中生成新列

    我有一个 pandas 数据框 如下所示 portion used 0 1 1 0 1 2 0 3 2 3 0 0 3 4 0 8 我想根据以下内容创建一个新专栏used列 以便df看起来像这样 portion used alert 0 1
  • 出于安全目的,您是否有理由不执行自己的算法来打乱 ID?

    我计划实现我自己的非常简单的 哈希 公式 为具有多个用户的应用程序添加一层安全性 我目前的计划如下 用户创建一个帐户 此时后端会生成一个 ID ID 通过公式运行 假设 ID 57 8926 36 7 或同样随机的东西 然后 我将新的用户
  • KML 中的 JavaScript 被 Google 地球插件忽略

    我创建了一个简单的 KML 文件 该文件可以在独立的 Google 地球客户端中运行 但在 Google 地球插件中根本无法运行 无论浏览器如何
  • gstreamer 中的无缝视频循环

    我正在尝试使用 gstreamer 循环播放视频 它是 python 绑定 第一次尝试是hook EOSmessage并为管道生成搜索消息 import gi gi require version Gst 1 0 from gi repos
  • 有没有比 Python 内置 == 运算符更快的方法来测试两个列表是否具有完全相同的元素?

    如果我有两个列表 每个列表有 800 个元素长并填充整数 有没有比使用内置元件更快的方法来比较它们具有完全相同的元件 如果没有 则短路 操作员 a 6 2 3 88 54 486 b 6 2 3 88 54 486 a b gt gt gt
  • jQuery 倒计时插件 - 只显示非零周期

    我正在使用 jQuery 倒计时插件编写倒计时 我只希望它显示活动 非零 周期 例如代替 剩余时间 0 天 0 小时 13 分 20 秒 它应该只显示 13 分 20 秒 我的代码是 countdown countdown expiryUr
  • ReactJS setState 仅在嵌套在 setState 中时才有效

    问题 当我使用 this setState 并在回调中输出状态时 它根本不会改变 但是当我将 setstate 嵌套在 setstate 中时 它将正常工作 例子 这不行 this setState data newData 这确实有效 t

随机推荐