2013-12-19 176 views
8

我一直在寻找解决这个问题的方法。Python导入模块,文件夹结构

我有一个Python项目,这是该文件夹结构我想:

/project/main.py 
/project/src/models.py 
/project/test/tests.py 

我希望能够在终端执行tests.py运行测试。 tests.py在/ project/src /中导入模块以进行测试。首先,我通过在tests.py中添加 sys.path.insert(0, '..')来解决这个问题。但是然后models.py用于打开文本文件的路径必须与tests.py等相关。这意味着程序在执行main.py时不会运行,路径的原因。

我也试过当导入模块到tests.py,如from ..src.models import *,但给出了错误消息说:“尝试相对导入非包”。

我应该把什么放在tests.py的顶部,以便能够从models.py导入模块?

+0

你使用的是什么版本的Python? – jpmc26

+0

Python版本2.7.5 – user1121487

回答

3

您使用的结构不是我会推荐的结构,但我是Python项目通常结构化的比较新手。我相信这会做你以后:

1)将一个__init__.py文件中/project/project/src,并/project/test以确保他们当作包。

2)将from __future__ import absolute_import放在每个Python文件的顶部。

3)然后使用相对进口:

test.py

from ..src import models 

main.py

from .src import models 

4)你需要以不同的方式启动应用程序。确保您的当前目录是/project父(这似乎是文件系统的根目录)并运行你的项目是这样的:

python -m project.main 

对于我自己的项目,我一定会把main.pysrc,如果它是起点的应用程序。我也许会把tests.py也放在src之内,但如果不是的话,我会在命令行而不是代码中将/project/src添加到测试运行器的Python路径中。

无论如何我仍然会使用absolute_import。根据我的经验,这是一个非常干净的解决方案,模块组织,这也是事物如何在默认情况下在Python工作3

+0

我仍然得到这个:ValueError:尝试在非包中的相对导入。我现在到处都是__init__.py。 – user1121487

+0

@ user1121487是的。刚刚意识到这一点抱歉。我的编辑应该解决它,如果你没有弄清楚。 – jpmc26

+0

它仍然给出相同的错误信息。 – user1121487

0

首先把在src目录中main.py ..

在测试中

你可以做,sys.path。追加(“src目录”)

,如果你想从那里您正在执行的应用程序,我建议你添加

import os 
os.chdir('relative path to the src dir') 

thisway你的程序将在运行强制执行是在特定的目录,无论你所指定的目录,所以它会尊重你在你的代码中的相对路径