Python导入模块,文件夹结构

时间:2013-12-19 23:26:50

标签: python path relative-path python-module

我一直在寻找解决这个问题的方法。

我有一个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时,我也尝试使用 dot ,例如from ..src.models import *,但是会出现错误消息“非包装中尝试相对导入”。

我应该在tests.py的顶部放置什么才能从models.py导入模块?

2 个答案:

答案 0 :(得分: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.py放在src内。我也可以将tests.py放在src中,但如果没有,我会在命令行而不是代码中将/project/src添加到测试运行程序的Python路径中。

我仍然会使用absolute_import。根据我的经验,它是模块组织的一个非常干净的解决方案,它也是Python 3中默认情况下的工作方式。

答案 1 :(得分:0)

首先将你的main.py放在src目录中。

你可以在测试中使用

,sys.path.append('src目录')

如果您想强制执行在特定目录中,无论您在哪里执行应用程序,我建议您添加

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

这样你的程序将在你指定的目录中运行,因此它将尊重你在代码中的相对路径