如何从上面的嵌套文件夹中正确导入?

How to import properly from the nested folder above?

我有以下结构:

/a
 /b
  module1.py
/c
  module2.py

因此,从某个根文件夹中有 2 个模块:

a/b/module1.py 和

c/module2.py

我想从模块 2 导入模块 1 的一些功能。

所有 3 个文件夹都有 ____init___.py

两个py文件里面都有:

if __name__ == '__main__':
    func()

module2.py 具有以下导入代码:

from .. a.b.module1 import func1

如果我只是 运行 module2.py 从终端(留在根文件夹中):

python -m c.module2.py 

我有以下错误:

ValueError: attempted relative import beyond top-level package

如何解决这个问题?

这是 python 导入系统的一个常见问题,但使其更易于管理的一种方法可能是在项目根目录的另一个 __init__.py 中定义一些导入,这将创建您的包和所有子目录的单独命名空间。

我设置目录以重现您的错误的方式是这种结构:

根目录:/package

/package
/package/__init__.py
/package/a
/package/a/__init__.py
/package/a/b
/package/a/b/__init__.py
/package/a/b/module1.py
/package/c
/package/c/__init__.py
/package/c/module2.py

package/__init__.py中放置顶级模块导入:

from a.b import module1

然后我所做的唯一更改是 module2.py 仅包含此函数用于测试:

from package import a # import top-level module from root package 

def func():
    a.b.module1.some_object() # call function of module1 from module2 (this module).

if __name__ == '__main__':
    func()

然后在包的顶级根目录中,您应该可以从终端 运行 module2.py:

$ python package/c/module2.py 

应该打印出来:

from a.b.module1: some object

可以进行改进和改进以获得您想要的确切行为。

作为参考,我使用了这个答案的建议:How to avoid circular imports in Python?