Ath*_*ade 3 javascript python pyodide
每当我在 pyodide 中导入 python 模块时,都会出现此错误。
pyodide.js:108 Invalid package name or URI
Run Code Online (Sandbox Code Playgroud)
我不确定如何正确导入模块,我已经尝试过文档中提到的这一点。
pyodide.loadPackage('<module address>')
Run Code Online (Sandbox Code Playgroud)
(这会返回一个关于我运行此方法的决议的承诺)
pyodide.runPython('
<python code here>
')
Run Code Online (Sandbox Code Playgroud)
执行后,我收到上述错误。
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>
Run Code Online (Sandbox Code Playgroud)
这个问题可能不清楚,但如果您在理解某些问题时遇到困难,请告诉我。
另外,方法中传递的字符串runPython()是python代码,只是为了避免混淆。
我什至尝试将模块上传到服务器,因为文档提到了使用 HTTP 协议的 URL,这种尝试非常愚蠢,但我还是这么做了。
文档:https ://pyodide.readthedocs.io/en/latest/using_pyodide_from_javascript.html#loading-packages
更新:Pyodide v0.21.0
从 Pyodide 0.18.0 开始,runPythonAsync不会自动加载包,因此应事先调用loadPackagesFromImports 。
因此,要导入第三方包,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())
Run Code Online (Sandbox Code Playgroud)
或者我们可以使用loadPackagesFromImports函数来自动下载代码片段导入的所有包:
// 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
Run Code Online (Sandbox Code Playgroud)
(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 immediatelyRun Code Online (Sandbox Code Playgroud)
<script src="https://pyodide-cdn2.iodide.io/v0.21.0/full/pyodide.js"></script>Run Code Online (Sandbox Code Playgroud)
另请注意,从版本 0.17 开始,Pyodide 对非 JS 数据类型使用 JsProxy。因此,在打印结果之前,必须使用toJs进行转换。
旧答案(与 Pyodide v0.15.0 相关)
目前尚不清楚您<address>在 中传递的是什么pyodide.loadPackage('<address>'),但它应该只是包名称(例如numpy)。
另请注意,Pyodide 目前支持的软件包数量有限。查看本教程以了解更多详细信息。
如果你想导入第三方包,numpy有两种选择:你可以手动预加载所需的包,然后使用pyodide.loadPackage和pyodide.runPython函数将它们导入到 Python 中:
pyodide.loadPackage('numpy').then(() => {
// numpy is now available
pyodide.runPython('import numpy as np')
console.log(pyodide.runPython('np.ones((3, 3)))'))
})
Run Code Online (Sandbox Code Playgroud)
或者您可以使用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))
})Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4565 次 |
| 最近记录: |