在Jupyter Notebook中导入时找不到模块。
在Jupyter Notebook中导入时找不到模块。
我有以下的包(和工作目录):
工作目录-- |--MyPackage-- | |--__init__.py | |--module1.py | |--module2.py | |--notebook.ipynb
在__init__.py
中,我有:
import module1 import module2
如果我尝试在我的notebook中导入MyPackage:
import MyPackage as mp
我会得到ModuleNotFoundError: No module named 'module1'
。但是如果我在notebook之外的脚本中执行同样的操作,导入工作正常:如果我在相同的目录中创建test.py
并执行与notebook中相同的操作,导入将正常工作。如果我在__init__.py
中使用完全限定的名称(import MyPackage.module1
),它将在notebook中正常工作。
为什么导入行为不同呢?
我已经确认notebook的工作目录是WorkingDirectory
。
--- 更新---------
确切的错误是:
C:\Users\Me\Documents\Working Directory\MyPackage\__init__.py in() ---> 17 import module1 ModuleNotFoundError: No module named 'module1'
我的问题与可能的重复问题不同:
- notebook能够找到包,但只是无法加载模块。这是通过将
module1
替换为MyPackage.module1
工作良好来推断的,这表明它可能与PATH
无关。 - 我进入了
WorkingDirectory
并在那里启动了服务器。工作目录应该是包含我的包的文件夹。
在Jupyter Notebook中出现(Module Not found during import)的问题,解决的最佳方法是创建一个虚拟环境并将内核指向该虚拟环境:
步骤:
1. 运行命令:python -m venv venv
创建一个虚拟环境。
2. 运行命令:source venv/bin/activate
激活虚拟环境。
3. 运行命令:ipython kernel install --user --name=venv
将内核安装到虚拟环境。
4. 运行命令:jupyter lab
启动Jupyter Lab。
5. 在Jupyter Lab中,依次点击"kernel" -> "change kernel" -> "add the venv from the dropdown",将虚拟环境添加到内核中。
现在,如果虚拟环境已经安装了所需的包,Jupyter Lab也可以看到这个包,并且能够成功导入该包,问题将得到解决。
在Jupyter Notebook中进行导入时发生(Module Not found during import in Jupyter Notebook)的错误,可能有以下的原因和解决方法。
首先,我们可以使用以下两个函数来查看当前工作目录和更改当前工作目录:
#列出当前的工作目录 os.getcwd() #更改当前的工作目录 os.chdir()
如果出现错误,可以尝试改变路径并导入模块:
import sys # sys.path是一个绝对路径字符串的列表 sys.path.append('/path/to/application/app/folder') import file
另外,需要注意的是os.chdir需要一个参数。
在Jupyter Notebook中出现(Module Not found during import in Jupyter Notebook)这个问题的原因是由于Jupyter Notebook的当前工作目录(cwd)始终是启动服务器的基本路径,而不管运行import os os.getcwd()
返回的是什么。解决方法是使用import sys sys.path.append("/path/to/your/module/folder")
将模块所在文件夹的路径添加到sys.path中。
根据之前提到的链接,这个问题的解决方法是将模块所在文件夹的路径添加到sys.path中。在之前修改sys.path之前,代码无法运行,但在修改之后就可以正常运行了。
在这个的问题中,有人问是否将WorkingDirectory
或WorkingDirectory/MyPackage
添加到PATH
中。前者不起作用,后者起作用。这是预期的行为吗?如果问题出在PATH
上,为什么在init.py中使用完全限定的名称可以解决问题?
这个的问题中没有给出明确的解释,但可以推测,将WorkingDirectory/MyPackage
添加到PATH
中可能是因为这样可以让系统在任何地方都能找到模块。而在init.py中使用完全限定的名称可能是因为这样可以直接指定模块的位置,不依赖于PATH
。
解决这个问题的方法是将模块所在文件夹的路径添加到sys.path中。通过这种方式,Jupyter Notebook就能够正确找到并导入模块,避免了(Module Not found during import in Jupyter Notebook)的错误。