2015-09-25 42 views
3

导入模块我有一个Python 3项目多数民众赞成结构是这样的:无法从同级目录

/project 
    __init__.py 
    /models 
     __init__.py 
     my_model.py 
     base_model.py 
    /tests 
     __init__.py 
     test.py 

test.py我想导入my_model。我的第一次尝试是from models import my_model,它投了一个ImportError: No module named 'models'This question建议将__init__.py文件添加到每个目录,这没有帮助。 Another post说要修改与路径:

import sys; import os 
sys.path.insert(0, os.path.abspath('..')) 

但是,这将引发一个错误,当my_model,尝试从base_model进口。

这看起来很简单,但我很难过。有没有人有任何想法?

回答

1

使用绝对导入无处不在:from project.models import my_model,应该可以在您项目的任何地方都能正常工作,也不需要混淆路径。

+0

当我从'project.models'导入时,我仍然得到'ImportError'。我三重检查了根文件夹是否有'__init __。py'和一切。 – Rob

+1

''测试/''还有''__init __。py''吗?我现在注意到它在您的列表中缺失。 – proycon

+0

尽管我有点承诺不会弄乱路径,你的项目目录的父目录应该在你的''PYTHONPATH''(或''sys.path.insert()''它) – proycon

0

添加同级目录sys.path应该工作:

import sys, os 
sys.path.insert(0, os.path.abspath('../models')) 
import my_model 
1

答案取决于你如何启动test.py. 我知道做相对导入的唯一方法是将文件放入包中。为了让Python解释器知道你在包中是以某种方式导入它的。

用途:

from ..models import my_model 
在test.py

,并推出以下项目文件夹中的Python解释器。

然后,您将能够无误地导入project.tests.test。

+0

我直接启动test.py从命令行。当我尝试'从..models导入my_model'时,它给我一个错误'父模块''未加载,不能执行相对导入'。我确保根目录有一个'__init __。py'文件。 – Rob