Jupyterlite:访问单独文件中的函数和库?

问题描述 投票:0回答:2

我有一个 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")

jupyter python-module pyodide jupyterlite
2个回答
3
投票

我在当前直播中重现了您的问题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

这不会让你直接进入笔记本,但它提供了一种预先运行代码的方法,也许你可以用它来解决你的问题。


1
投票

是否可以在文件中加载模块,然后将其导入笔记本中,而无需调用例如在笔记本本身中导入 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 提出的解决方法是可行的。

© www.soinside.com 2019 - 2024. All rights reserved.