Python 在Jupyter笔记本中导入期间未找到模块
我有以下软件包(和工作目录): 在Python 在Jupyter笔记本中导入期间未找到模块,python,python-3.x,jupyter-notebook,python-import,python-module,Python,Python 3.x,Jupyter Notebook,Python Import,Python Module,我有以下软件包(和工作目录): 在\uuuu init\uuuuu.py中,我有: import module1 import module2 如果我尝试将我的软件包导入笔记本: import MyPackage as mp 我将获得ModuleNotFoundError:没有名为'module1'的模块。但是,如果我在笔记本之外执行脚本,导入可以正常工作:如果我在同一个目录中创建test.py,并执行与笔记本中相同的操作,导入将正常工作。如果我在\uuu init\uuuu.py中使用完
\uuuu init\uuuuu.py
中,我有:
import module1
import module2
如果我尝试将我的软件包导入笔记本:
import MyPackage as mp
我将获得ModuleNotFoundError:没有名为'module1'的模块
。但是,如果我在笔记本之外执行脚本,导入可以正常工作:如果我在同一个目录中创建test.py
,并执行与笔记本中相同的操作,导入将正常工作。如果我在\uuu init\uuuu.py
中使用完全限定名(导入MyPackage.module1
),它将在笔记本中工作
不同导入行为的原因是什么
我已确认笔记本的工作目录为WorkingDirectory
---更新---------
确切的错误是:
C:\Users\Me\Documents\Working Directory\MyPackage\__init__.py in <module>()
---> 17 import module1
ModuleNotFoundError: No module named 'module1'
C:\Users\Me\Documents\Working Directory\MyPackage\\uuuu init\uuuuuu.py in()
--->17导入模块1
ModuleNotFoundError:没有名为“module1”的模块
我的问题与可能的重复问题不同:
MyPackage替换module1
推断出来的。module1
运行良好,表明这可能不是与路径相关的问题
WorkingDirectory
并在那里启动了服务器。工作目录应该是包含我的包的文件夹我很确定这个问题是相关的,答案将帮助您: tl;dr笔记本服务器的cwd始终是启动服务器的基本路径,无论运行的是
import os os。getcwd()
。使用导入sys.path.append(“/path/to/your/module/folder”)
我使用与您指定的相同结构的一些虚拟模块运行它,在修改
sys.path
之前,它不会运行,之后它会运行,原因是您的MyPackage/\uu init\uuuuuuuuupy
是从当前工作目录运行的。例如,在这种情况下,从工作目录
。这意味着解释器找不到名为module1
的模块,因为它不在当前或全局包目录中
这方面几乎没有解决办法。例如,您可以像这样临时覆盖当前工作目录
cwd = os.getcwd()
csd = __path__[0]
os.chdir(csd)
然后,在完成所有包初始化操作(如import module1
)后,使用os.chdir(cwd)
恢复“调用者”的工作目录
对于我来说,这是一种非常糟糕的方法,因为,例如,如果在初始化操作中引发异常,则无法恢复工作目录。您需要使用try..except
语句来修复此问题
另一种方法是使用相对进口。有关更多详细信息,请参阅
下面是一个适用于您的示例的MyPackage/\uuuuu init\uuuuu.py
:
from .module1 import *
但它也有一些不足之处,而这些不足之处是通过文献中的经验发现的。例如,您不能编写类似于import.module1
的内容
Upd:
我发现,即使从常用的python控制台运行
importmypackage
,也会引发此异常。不是来自Ipyton或Jupyter笔记本的。所以这似乎不是IPython本身的问题。两行代码可以解决这个问题
#list the current work dir
os.getcwd()
#change the current work dir
os.chdir()
更改路径,导入模块,玩得开心。可能重复的@LouiseDavies我更新了我的问题以解决重复的问题。我遇到过类似的问题,它连接到一些旧内核,但没有所有的包;确保您一次有一个,并且它连接到默认端口8888。您是要将
WorkingDirecotry
添加到PATH
还是WorkingDirectory/MyPackage
?后者有效,但前者无效。这是预期的行为吗?如果路径
是问题所在,为什么在init.py中使用完全限定名可以解决问题?
#list the current work dir
os.getcwd()
#change the current work dir
os.chdir()