3

每当我在 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()是python代码,只是为了避免混淆。

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

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

4

1 回答 1

4

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

另请注意,Pyodide 目前支持数量有限的软件包。查看我的教程以获取更多详细信息。

如果要导入第三方包numpy,有两种选择:您可以手动预加载所需的包,然后在 Python 中使用pyodide.loadPackagepyodide.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))
})
    <!DOCTYPE html>
    <html>
    <head>
    <script src="https://pyodide-cdn2.iodide.io/v0.15.0/full/pyodide.js"></script>
    </head>
    <body>
    </body>
    </html>

于 2020-10-18T22:30:51.227 回答