繁体   English   中英

在 Jupyter Notebook 中导入期间找不到模块

[英]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'

我的问题与可能的重复问题不同:

  1. 笔记本能找到package,但只能加载模块。 这是从用MyPackage.module1替换module1推断出来的,效果很好,表明它可能不是与PATH相关的问题。

  2. 我进入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)

pip 安装模块名称

之后,您可以轻松导入和使用它。 每当你想告诉 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 指向该虚拟环境:

脚步:

  1. python -m venv venv
  2. source venv/bin/activate
  3. ipython kernel install --user --name=venv
  4. jupyter lab
  5. 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 实验室服务器运行时将我的日记移动到一个新目录时,这发生在我身上。 该日志的导入中断了,但是当我在同一目录中创建新日志时,我刚刚移动到并使用了相同的导入,它起作用了。 为了解决这个问题,我:

  1. 去了我的项目的根目录。
  2. 搜索所有标有“ pycache ”的文件夹
  3. 删除了在我的根文件夹和子文件夹中找到的所有“ pycache ”文件夹。
  4. 重新启动 Jupyter 实验室服务器

一旦 Jupyter 实验室重新启动并编译您的代码,“ pycache ”文件夹将重新生成。 pycache 文件夹也有两个前导和尾随“_”,但 stackoverflow 正在格式化没有它们的 pycache

到目前为止(对我而言)最好的解决方案是为您正在使用的每个环境设置一个 kernel。然后,定义了 kernel,您所要做的就是更新此内核的环境变量以查看您的模块所在的项目文件夹位于。

步骤(使用pip ):

  1. pip install ipykernel (如果尚未安装)
  2. source activate <your environment name>
  3. python -m ipykernel install --user --name <your environment name> --display-name "<a display name>" (其中是你想给你的 kernel 的名字,并且只是 jupyter 用于显示的名称。
  4. 运行上面的命令后,它将 output 配置文件的位置 kernel 。 例如: C:\Users\<your user name>\AppData\Roaming\jupyter\kernels\<selected environment name> Go到这个文件夹,打开kernel.json文件。
  5. 将以下条目添加到此文件中:
"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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM