我有一个 JupyterLite/pyodide 会话运行一个名为“Workshop1.ipynb`的节点簿。在与该笔记本相同的(根)目录中,我有一个包含有用函数的文件,该函数也执行一些导入,例如
# functions.py
import numpy as np
def a_useful_function(val):
return np.array(val) * 2
我想将
import functions
称为笔记本的第一行,以使用笔记本中定义的函数,但随后我得到
ModuleNotFoundError: The module 'numpy' is included in the Pyodide distribution, but it is not installed.
You can install it by calling:
await micropip.install("numpy") in Python, or
await pyodide.loadPackage("numpy") in JavaScript
是否可以在文件中加载模块,然后将其导入笔记本中,而无需调用例如笔记本本身中的
import numpy
和/或 await micropip.install("numpy")
?
我在当前直播中重现了您的问题jupyterlite。老实说,如果这实际上不是 jupyterlite 中的错误,我会感到惊讶,这将在未来的迭代中得到解决。
我发现的解决方法是在笔记本本身中执行一些有问题的导入(如果可能的话)。这是最干净的解决方案。
还有另一种解决方案,甚至是 numpy.org 网站本身也采用的,即使用
?code=CODE
URL 参数。您可以在此处查看一些示例。如果你进入浏览器控制台,你可以看到这是numpy网站使用的URL:
https://jupyterlite.github.io/demo/repl/?toolbar=1&kernel=python&code=import%20numpy%20as%20np
当然,你可以在URL本身中写空格,这样就变成了:
https://jupyterlite.github.io/demo/repl/?toolbar=1&kernel=python&code=import numpy as np
这不会让你直接进入笔记本,但它提供了一种预先运行代码的方法,也许你可以用它来解决你的问题。
是否可以在文件中加载模块,然后将其导入笔记本中,而无需调用例如在笔记本本身中导入 numpy 和/或等待 micropip.install("numpy") ?
简短的回答是否定的。与常规 Python 类似,您需要在运行代码之前指示应安装哪些包。
现在有许多改进的安装方法。不再需要
micropip.install()
,您可以像在现代 Jupyter 生态系统的其他部分一样使用 %pip install <package_name>
。您可以使用 %pip install -r requirements.txt
进行安装,其中您的软件包会列在名为 requirements.txt
的文本文件中,每个软件包位于单独的行中。
从目前的技术角度来看,在 Pyodide 中,我们无法在导入(同步)期间安装包(这是异步操作)。除非我们递归地解析导入,这会带来性能开销。
除此之外,加载在
pyodide.runPythonAsync
代码片段中导入的包是一项方便的功能(JupyterLite 正在使用)。但是,我不认为将其扩展到二级导入是一个好主意:即按照您的 import functions
并查看它有哪些导入。出于同样的原因,Python 通常不会在导入时 pip install 包。从安全性和可靠性角度来看,这都不是很好。
在实践中,如果您不想在笔记本中指定要求,@TachyonicBytes 提出的解决方法是可行的。