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

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

notebook.jpynb中工作时,如果我try 使用相对导入来访问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文件(甚至是一个空白文件),这很好,但这样做不足以解决问题.

我在机器之间共享这个目录,相对导入允许我在任何地方使用相同的代码,&amp;我经常使用笔记本进行快速原型制作,因此涉及将绝对路径拼凑在一起的建议不太可能有帮助.


编辑:这与Relative imports in Python 3不同,后者一般谈论Python3中的相对导入,尤其是从包目录中运行脚本.这与在jupyter笔记本中工作有关,该笔记本试图调用另一个目录中的本地模块中的函数,该目录既具有不同的一般方面,也具有不同的特定方面.

推荐答案

在第this notebook节中,我有一个几乎与您相同的示例,我想以一种枯燥的方式演示相邻模块的函数的用法.

我的解决方案是通过在笔记本中添加一个类似这样的代码片段来告诉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)

这允许您从模块层次 struct 中导入所需的功能:

from project1.lib.module import function
# use the function normally
function(...)

请注意,如果您还没有空的__init__.py个文件,则有必要将它们添加到project1/lib/文件夹中.

Python相关问答推荐

如何编写一个正规表达式来查找序列中具有2个或更多相同辅音的所有单词

如何让pyparparsing匹配1天或2天,但1天和2天失败?

机器人与Pyton Minecraft服务器状态不和

当值是一个integer时,在Python中使用JMESPath来验证字典中的值(例如:1)

在Python和matlab中显示不同 colored颜色 的图像

使用mySQL的SQlalchemy过滤重叠时间段

即使在可见的情况下也不相互作用

删除最后一个pip安装的包

带条件计算最小值

如何根据参数推断对象的返回类型?

如何将多进程池声明为变量并将其导入到另一个Python文件

给定高度约束的旋转角解析求解

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

什么是合并两个embrame的最佳方法,其中一个有日期范围,另一个有日期没有任何共享列?

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

python panda ExcelWriter切换动态公式到数组公式

Maya Python脚本将纹理应用于所有对象,而不是选定对象

基于多个数组的多个条件将值添加到numpy数组

如何在验证文本列表时使正则表达式无序?

解决Geopandas和Altair中的正图和投影问题