[英]Module Not found during import in Jupyter Notebook
我有以下 package(和工作目录):
WorkingDirectory--
|--MyPackage--
| |--__init__.py
| |--module1.py
| |--module2.py
|
|--notebook.ipynb
在__init__.py
我有:
import module1
import module2
如果我尝试将 MyPackage 导入我的笔记本:
import MyPackage as mp
我会得到ModuleNotFoundError: No module named 'module1'
。 但如果我在笔记本外执行脚本,导入工作正常:如果我在同一目录中创建test.py
并执行与笔记本中相同的操作,导入将正常工作。 如果我在__init__.py
( import MyPackage.module1
) 中使用完全限定名称,它将在笔记本中工作。
不同导入行为的原因是什么?
我已经确认笔记本的工作目录是WorkingDirectory
。
- -更新 - - - - -
确切的错误是:
C:\Users\Me\Documents\Working Directory\MyPackage\__init__.py in <module>()
---> 17 import module1
ModuleNotFoundError: No module named 'module1'
我的问题与可能的重复问题不同:
笔记本能找到package,但只能加载模块。 这是从用MyPackage.module1
替换module1
推断出来的,效果很好,表明它可能不是与PATH
相关的问题。
我进入WorkingDirectory
并在那里启动服务器。 工作目录应该是包含我的 package 的文件夹。
我很确定这个问题是相关的,那里的答案会对你有所帮助: https://stackoverflow.com/a/15622021/7458681
tl; dr 笔记本服务器的 cwd 始终是您启动服务器的基本路径,无论运行import os os.getcwd()
说。 使用import sys sys.path.append("/path/to/your/module/folder")
。
我使用与您指定的结构相同的一些虚拟模块运行它,并且在修改sys.path
之前它不会运行,之后它会
两行代码就可以解决这个问题,
#list the current work dir os.getcwd() #change the current work dir os.chdir()
改变路径,导入模块,玩得开心。
如果您在jupyter 环境中找不到模块,则必须在 jupyter 环境中安装它,而不是在命令提示符下安装它
通过 jupyter 上的这个命令(对于 Windows)
之后,您可以轻松导入和使用它。 每当你想告诉 jupyter 这是系统命令时,你应该把 (. ) 放在你的命令之前
您可以通过安装import_ipynb
package 来做到这一点。
pip install import_ipynb
假设你想在A.ipynb
中导入B.ipynb
,你可以这样做:
在A.ipynb
:
import import_ipynb import B as b
然后你可以在A
中使用B.ipynb
的所有功能。
解决此问题的最佳方法是创建一个虚拟环境并将您的 kernel 指向该虚拟环境:
脚步:
python -m venv venv
source venv/bin/activate
ipython kernel install --user --name=venv
jupyter lab
go to the jupyter lab ->kernel-->change kernel-->add the venv from the dropdown
现在,如果您的 venv 安装了 package,jupyter 实验室也可以看到 package,并且导入 package 也没有问题。
我的问题是我在使用Vs Code时使用了错误的 conda 环境。
输入您的 conda 环境
conda activate **enviroment_name**
要检查模块的安装位置,您可以通过编写 python 或 python3 进入 python 交互模式。 然后导入cv2
import cv2
然后看看这个模块安装在哪里
print(cv2.__file__)
您将看到模块的安装路径。 我的问题是我的 vs 代码 kernel 设置为错误的环境。 这可以在 vs 代码的右上角进行更改。
希望这可以帮助
当我在 Jupyter 实验室服务器运行时将我的日记移动到一个新目录时,这发生在我身上。 该日志的导入中断了,但是当我在同一目录中创建新日志时,我刚刚移动到并使用了相同的导入,它起作用了。 为了解决这个问题,我:
一旦 Jupyter 实验室重新启动并编译您的代码,“ pycache ”文件夹将重新生成。 pycache 文件夹也有两个前导和尾随“_”,但 stackoverflow 正在格式化没有它们的 pycache
到目前为止(对我而言)最好的解决方案是为您正在使用的每个环境设置一个 kernel。然后,定义了 kernel,您所要做的就是更新此内核的环境变量以查看您的模块所在的项目文件夹位于。
步骤(使用pip
):
pip install ipykernel
(如果尚未安装)source activate <your environment name>
python -m ipykernel install --user --name <your environment name> --display-name "<a display name>"
(其中是你想给你的 kernel 的名字,并且只是 jupyter 用于显示的名称。C:\Users\<your user name>\AppData\Roaming\jupyter\kernels\<selected environment name>
。 Go到这个文件夹,打开kernel.json
文件。"env": {
"PYTHONPATH": "${PYTHONPATH};<the path to your project with your modules>
}
关于 kernel 安装命令的很好的参考。
原因是您的MyPackage/__init__.py
是从当前工作目录运行的。 例如,在这种情况下来自WorkingDirectory
。 这意味着,该解释器找不到名为module1
的模块,因为它既不位于当前包目录中,也未位于全局包目录中。
解决方法很少。 例如,您可以像这样临时覆盖当前工作目录
cwd = os.getcwd() csd = __path__[0] os.chdir(csd)
然后,在所有 package 初始化操作(如import module1
module1)完成后,使用os.chdir(cwd)
恢复“调用者”的工作目录。
这对我来说是一个非常糟糕的方法,因为例如,如果在初始化操作中引发异常,则不会恢复工作目录。 您需要使用try..except
语句来解决此问题。
另一种方法是使用相对导入。 有关更多详细信息,请参阅文档。
这是适用于您的示例的MyPackage/__init__.py
示例:
from.module1 import *
但它几乎没有什么缺点,而是通过文档凭经验发现的。 例如,您不能编写类似import.module1
的内容。
更新:我发现即使import MyPackage
从通常的 python 控制台运行也会引发此异常。 不是来自 IPython 或 Jupyter Notebook。 所以这似乎不是 IPython 本身的问题。
不要再看了。 这是简单的解决方案。
您希望能够输入笔记本单元格以从 Jupyter 笔记本中安装包。 要从 Jupyter 笔记本中安装示例 package,您需要在仍处于正常编辑模式的正常单元格中键入以下内容:
%pip 安装 PyPDF2
这使用了 pip 魔术命令,确保安装发生在支持笔记本电脑底层 kernel 的环境中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.