在Jupyter Noteb中导入期间未找到模块

2024-05-08 03:42:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下包(和工作目录):

WorkingDirectory--
                 |--MyPackage--
                 |            |--__init__.py
                 |            |--module1.py
                 |            |--module2.py
                 |
                 |--notebook.ipynb

__init__.py我有:

import module1
import module2

如果我尝试将包导入笔记本:

import MyPackage as mp 

我会得到ModuleNotFoundError: No module named 'module1'。但是,如果在笔记本外部执行脚本,import可以正常工作:如果在同一个目录中创建test.py,并在笔记本中执行相同的操作,则import可以正常工作。如果我在__init__.pyimport MyPackage.module1)中使用完全限定名,它将在笔记本中工作。

不同进口行为的原因是什么?

我已经确认笔记本的工作目录是WorkingDirectory

---更新-----

准确的错误是:

C:\Users\Me\Documents\Working Directory\MyPackage\__init__.py in <module>()
---> 17 import module1

ModuleNotFoundError: No module named 'module1'

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

  1. 笔记本找到了包,但无法加载模块。这是从用MyPackage.module1替换module1效果良好推断出来的,并表明这可能与PATH无关。

  2. 我进入WorkingDirectory并在那里启动了服务器。工作目录应该是包含我的包的文件夹。


Tags: nopyimport目录init笔记本namedmodule1
2条回答

原因是您的MyPackage/__init__.py是从当前工作目录运行的。E、 在这种情况下,从WorkingDirectory开始。这意味着,解释器找不到名为module1的模块,因为它不在当前或全局包目录中。

对此几乎没有解决办法。例如,可以临时重写当前工作目录,如下所示

cwd = os.getcwd()
csd = __path__[0]
os.chdir(csd)

然后,在像import module1这样的所有包初始化操作完成之后,使用os.chdir(cwd)还原“调用者”的工作目录。

对我来说,这是一个相当糟糕的方法,因为,例如,如果初始化操作引发异常,则不会还原工作目录。您需要使用try..except语句来修复此问题。

另一种方法是使用相对进口。有关详细信息,请参阅documentation

下面是一个MyPackage/__init__.py的示例,它将适用于您的示例:

from .module1 import *

但它几乎没有什么缺点,而这些缺点是根据经验通过文献发现的。例如,您不能编写类似import .module1的内容。


升级版: 我发现即使从通常的python控制台运行import MyPackage,也会引发此异常。不是从IPython或Jupyter笔记本。所以这似乎不是一个伊普顿本身的问题。

我很确定这个问题是相关的,那里的答案会帮助你:https://stackoverflow.com/a/15622021/7458681

tl;dr笔记本服务器的cwd始终是启动服务器的基本路径,无论运行的是什么。使用import sys sys.path.append("/path/to/your/module/folder")

我用一些与您指定的结构相同的虚拟模块运行它,在修改sys.path之前它不会运行,之后它会

相关问题 更多 >