python - 使用 Python 3 从另一个目录中的模块导入本地函数,并在 Jupyter Notebook 中进行相对导入

标签 python jupyter-notebook relative-import

我有一个类似下面的目录结构

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/

相关文章:

php - 用python加密数据,用php解密

python - 朱皮特 : Seaborn pairplot difficult to set graph dimensions for?

python - Homebrew 升级后的 Jupyter Notebook ModuleError

Python 相对/绝对导入(再次)

python - 尝试相对导入超出顶级包

Python 混淆函数引用

python - 在代码中考虑 Lambda 热启动?

python - 用字符串数组绘制 x 轴,与原始数组中的顺序相同,而不是在 matplotlib 中按字母顺序排序

python - Cron 作业(使用 django_cron)不更新对象