小编典典

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

all

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

meta_project
    project1
        __init__.py
        lib
            module.py
            __init__.py
    notebook_folder
        notebook.jpynb

在工作时,notebook.jpynb如果我尝试使用相对导入来访问以下function()函数module.py

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文件(甚至是空白文件),那很好,但这样做不足以解决问题。

我在机器之间共享这个目录,相对导入允许我在任何地方使用相同的代码,并且我经常使用笔记本进行快速原型设计,因此涉及将绝对路径组合在一起的建议不太可能有帮助。


编辑:这与Python 3 中的相对导入不同,后者通常谈论 Python 3 中的相对导入,特别是“从包目录中运行脚本”。这与在 jupyter
notebook 中工作有关,试图在另一个目录中调用本地模块中的函数,该目录具有不同的一般和特定方面。


阅读 94

收藏
2022-06-25

共1个答案

小编典典

我在这个笔记本中有几乎和你一样的例子,我想以
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(...)

Note that it is necessary to add empty __init__.py files to project1/ and
lib/ folders if you don’t have them already.

2022-06-25