我一直在寻找解决这个问题的方法。
我有一个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导入模块?
答案 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')
这样你的程序将在你指定的目录中运行,因此它将尊重你在代码中的相对路径