我具有以下结构:
/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
如何解决这个问题?
答案 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?