我有一个类似下面的目录结构
meta_project
project1
__init__.py
lib
module.py
__init__.py
notebook_folder
notebook.jpynb
在 notebook.jpynb
中工作时,如果我尝试使用相对导入来访问 module.py
中的函数 function()
:
from ..project1.lib.module import function
我收到以下错误:
SystemError Traceback (most recent call last)
<ipython-input-7-6393744d93ab> in <module>()
----> 1 from ..project1.lib.module import function
SystemError: Parent module '' not loaded, cannot perform relative import
有什么方法可以使用相对导入来使其工作?
注意,笔记本服务器是在 meta_project
目录级别实例化的,因此它应该可以访问这些文件中的信息。
另外请注意,至少按照最初的预期,project1
没有被认为是一个模块,因此没有 __init__.py
文件,它只是意味着作为文件系统目录。如果问题的解决方案需要将其视为一个模块并包含一个 __init__.py
文件(即使是空白文件)也可以,但这样做还不足以解决问题。
我在机器之间共享这个目录,并且相对导入允许我在任何地方使用相同的代码,并且我经常使用笔记本进行快速原型(prototype)设计,因此涉及将绝对路径组合在一起的建议不太可能有帮助。
编辑:这与 Relative imports in Python 3 不同,它一般讨论了 Python 3 中的相对导入,特别是从包目录中运行脚本。这与在 jupyter notebook 中工作有关,试图在另一个目录中调用本地模块中的函数,该目录具有不同的一般和特定方面。
最佳答案
我在 this notebook 中的示例与您几乎相同我想以 DRY 的方式说明相邻模块功能的用法。
我的解决方案是通过在笔记本中添加一个类似这样的片段来告诉 Python 那个额外的模块导入路径:
import os
import sys
module_path = os.path.abspath(os.path.join('..'))
if module_path not in sys.path:
sys.path.append(module_path)
这允许您从模块层次结构中导入所需的功能:
from project1.lib.module import function
# use the function normally
function(...)
请注意,如果您没有空的 __init__.py
文件,则需要将它们添加到 project1/ 和 lib/ 文件夹中已经。
关于python - 使用 Python 3 从另一个目录中的模块导入本地函数,并在 Jupyter Notebook 中进行相对导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34478398/