我的代码结构:
当我将模型从帐户应用程序导入到 to_do 应用程序时:
#in to_do/models.py
from ..accounts.models import Account
我有这个错误:
File "/home/ghost/projects/django_projects/To_Do_App/to_do_list/to_do/models.py", line 2, in <module>
from ..accounts.models import Account
ImportError: attempted relative import beyond top-level package
如何解决?
我尝试以这种方式导入我的模型
from accounts.models import Account
确保父目录中有一个
__init__.py
文件。这就是 python 将其识别为包的方式。
除了添加
__init__.py
文件之外,当您从包含所有顶级包的顶级目录运行代码时,您必须使用 -m
开关才能使相对导入正常工作 - 例如
$ cd to_do_list/..
$ python -m to_do_list.manage # note no .py
但是,在这种情况下最好坚持绝对导入并运行为:
$ cd to_do_list
$ python -m manage
让我重现您的错误:
Project_rootpath
--pkg
__init__.py
A.py
--pkg2
__init__.py
B.py
test_lib.py
在 B.py 中
print("module name: ", __name__)
from ..pkg import A
在test_lib.py中
from pkg import A
from pkg2 import B
运行 python test_lib.py
发生错误。
from ..pkg import A
ImportError: attempted relative import beyond top-level package
..pkg
指的是Project_rootpath。
由于脚本
test_lib.py
在工作空间 Project_rootpath 下运行,因此 sys.path 包含 xxx/Project_rootpath
。在这个项目中,顶级包是pkg
和pkg2
。 Project_rootpath 不能被视为一个包。
要修改这个问题,我们可以创建一个新的包pkg0并将pkg,pkg2放入pkg0中。