2014-02-17 75 views
1

让我解释的问题 - 我们有这样的项目:如何在Python中加载与其他模块名称相同的模块?

model/__init__.py 
model/abstract.py 
task/__init__.py 
task/model.py 

如何装入task/model.pymodel.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 

如何做这样的进口?


请求更多详细信息。

谷歌App Engine应用程序: - 主要是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根不模型):

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

您是否将'model.py'作为脚本运行? – BrenBarn

+0

不是 - 'model.py'被导入另一个带有'main'的模块。 – Chameleon

回答

0

虽然ndpu的答案相对应的进口工作,这个问题的答案是在我心中燃烧很简单:更改文件的名称,以避免这个错误

如果你有model.py在圆形目录里面,怎么把名字改成circle_model.py

然后,您应该能够导入模块,而无需任何相关导入..业务。

编辑 - 现在知道你不想重命名

确保您有一个__init__.py文件在你的src目录下,然后尝试相对进口​​

+0

我知道解决方法,但想知道如何不使用解决方法。 – Chameleon

+0

在'src'中试过'__init __。py''' =没有''''的模块'''ValueError:试图相对导入超出顶层包' – Chameleon

0
在其他给定

相对进口答案应该正常工作。但它不起作用,因为你有名字冲突。你有一个名为model的包和模块。尝试为您的包或模块使用其他名称。

+0

python是否限制你不能使用'name'模块在带有'name'的模块中 - 它确实存在吗? – Chameleon

0

我发现了两个技巧来迫使负载MODELE name到模块name

首先迫使只有绝对的装载:

from __future__ import absolute_import 
import name 

二是像以前的,但更多的代码和更多的本地影响:

save_path = sys.path[:] 
sys.path.remove('') 
import name 
sys.path = save_path 
+0

感谢您的建议,帮助人们! – Chameleon

相关问题