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

时间:2018-11-13 01:42:16

标签: python-3.x relative-path

我具有以下结构:

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

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

a / b / module1.py和

c / module2.py

我想从module2导入module1的某些功能。

所有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

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

这是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?

相关问题