当前位置: 首页 > 面试题库 >

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

唐腾
2023-03-14
问题内容

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

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笔记本中工作有关,该笔记本试图调用另一个目录中具有不同常规和特定方面的本地模块中的函数。


问题答案:

在此笔记本中,我有一个与您几乎相同的示例,在此我想以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 / 文件夹中。



 类似资料:
  • 当尝试编译名为UserO的原始文件时ptions.proto它有一个名为A的导入ccount.proto使用下面的命令 我得到以下错误: PS:用户选项。proto位于目录/home/project\u new1/settings中导入帐户。proto存在于目录/home/project\u new1/account中 原型描述符文件: 用户选项。原型 账户原型

  • 问题内容: 如何从父目录进行相对导入? 来自: 这给出了一个模棱两可的错误: 如何从父目录本地导入? 问题答案: 感谢您添加到您的问题。首先是一个答案,然后是一些解释。我建立了您的代码, 去获得,就像你拥有它一样。(我忽略了错误消息。) 如您所愿,将导入行设置回“ ../../../meme”。 (注释掉一些包含未使用变量的代码。) 然后在梅梅/ CMD /米姆目录,要么或者工作。 刚才我说去安装

  • 根据这个答案,您可以使用来使用类似这样的相对导入: 为什么相对导入不适用于sklearn。特征提取。文本 我验证了是一个具有以下功能的模块: 编辑 “不工作”,我的意思是它不导入模块。 我正在使用Python 3.4 绝对方式工作: 相对方式不:

  • 问题内容: 我想了解如何从导入的模块执行功能。 这是我到目前为止的位置。 app / mocking.py: app / my_module / init.py: 测试/模拟测试.py: 这不 符合 我的预期。“已修补”模块仅返回的未模拟值。如何模拟要导入到被测名称空间中的其他包中的方法? 问题答案: 当您从包中使用装饰器时,您 未在 修补名称空间(从本例中导入模块),而是在被测试的名称空间中对其

  • 问题内容: 我正在eclipse中进行两个项目,我想将一些类从项目a导入到项目b。我该怎么办? 有没有一种方法可以在不将项目添加到构建路径的情况下进行? 问题答案: 将项目A添加到项目B的构建路径。 请按照下列步骤操作: 通过 在Eclipse中右键单击项目B的文件夹进行编辑->属性->构建路径->项目->添加。 现在添加项目A

  • 我正在写一个应用程序使用Node.js.具体来说,我使用节点v10.3.0。此应用程序位于位于。此应用程序有一个package.json文件位于。这个应用程序引用了一个在中定义的类。需要注意的是表示自己的包。这个包是在中定义的。index.js代码如下: 当我尝试运行此操作时,会出现以下错误: 我的进口声明有什么问题?在我看来这是正确的。我是不是误解了什么? 项目js 谢谢