我有以下包(和工作目录):
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__.py
(import MyPackage.module1
)中使用完全限定名,它将在笔记本中工作。
不同进口行为的原因是什么?
我已经确认笔记本的工作目录是WorkingDirectory
。
---更新-----
准确的错误是:
C:\Users\Me\Documents\Working Directory\MyPackage\__init__.py in <module>()
---> 17 import module1
ModuleNotFoundError: No module named 'module1'
我的问题不同于可能的重复:
笔记本找到了包,但无法加载模块。这是从用MyPackage.module1
替换module1
效果良好推断出来的,并表明这可能与PATH
无关。
我进入WorkingDirectory
并在那里启动了服务器。工作目录应该是包含我的包的文件夹。
原因是您的
MyPackage/__init__.py
是从当前工作目录运行的。E、 在这种情况下,从WorkingDirectory
开始。这意味着,解释器找不到名为module1
的模块,因为它不在当前或全局包目录中。对此几乎没有解决办法。例如,可以临时重写当前工作目录,如下所示
然后,在像
import module1
这样的所有包初始化操作完成之后,使用os.chdir(cwd)
还原“调用者”的工作目录。对我来说,这是一个相当糟糕的方法,因为,例如,如果初始化操作引发异常,则不会还原工作目录。您需要使用
try..except
语句来修复此问题。另一种方法是使用相对进口。有关详细信息,请参阅documentation。
下面是一个
MyPackage/__init__.py
的示例,它将适用于您的示例:但它几乎没有什么缺点,而这些缺点是根据经验通过文献发现的。例如,您不能编写类似
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
之前它不会运行,之后它会相关问题 更多 >
编程相关推荐