如何在Python中加载与其他模块同名的模块?

时间:2014-02-17 21:05:50

标签: python google-app-engine

让我解释一下问题 - 我们有这样的项目:

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  

3 个答案:

答案 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