让我解释一下问题 - 我们有这样的项目:
model/__init__.py
model/abstract.py
task/__init__.py
task/model.py
如何加载到task/model.py
model.abstract
它的语法是什么?
# task/model.py
import model # it loads task/model.py not model
from model.abstract import test # there is no test exception
# model/abstract.py
test = 1
如何进行此类导入?
要求提供更多详情。
Google App Engine应用程序: - main是main.py
目录结构:
└───src
│ app.yaml
│ index.yaml
│ main.html
│ main.py
│ task_master_api.py
│
├───circle
│ model.py
│ __init__.py
│
├───model
│ abstract.py
│ xxx.py
│ __init__.py
│
├───task
│ model.py
│ __init__.py
│
├───user
│ model.py
│ __init__.py
异常(请参阅task.model而不是root模型):
from .. import model
logging.critical((type(model), model.__name__))
from model.abstract import AbstractNamed, AbstractForgetable
-
CRITICAL 2014-02-17 21:23:36,828 model.py:8] (<type 'module'>, 'task.model')
from model.abstract import AbstractNamed, AbstractForgetable
ImportError: No module named abstract
更多与答案有关。
from .. import model
给予例外。
ValueError: Attempted relative import beyond toplevel package
答案 0 :(得分:0)
虽然ndpu的答案中的相对导入应该有效,但我想到的这个问题的答案就是这样:更改文件的名称以避免此错误。
如果您在圈子目录中有model.py
,那么如何将名称更改为circle_model.py
?
然后,您应该能够导入没有任何相对导入..
业务的模块。
编辑 - 现在知道您不想重命名
确保您的src目录中有__init__.py
个文件,然后尝试相对导入from .model.abstract import test
答案 1 :(得分:0)
在另一个答案中给出的相对导入应该可以正常工作。但它没有用,因为你有名字冲突。你有一个名为model的包和模块。尝试为您的包或模块使用其他名称。
答案 2 :(得分:0)
我发现两个技巧强制加载模型name
到模块name
中:
首先强制绝对加载:
from __future__ import absolute_import
import name
第二种情况与以前相同,但代码更多,本地影响更大:
save_path = sys.path[:]
sys.path.remove('')
import name
sys.path = save_path