use*_*487 8 python python-module path relative-path
我一直在寻找解决这个问题的方法.
我有一个python项目,这是我想要的文件夹结构:
/project/main.py
/project/src/models.py
/project/test/tests.py
Run Code Online (Sandbox Code Playgroud)
我希望能够通过在终端中执行tests.py来运行测试.tests.py导入/ project/src /中的模块进行测试.首先,我通过添加sys.path.insert(0, '..')tests.py 来解决这个问题
.但是,在models.py中用于打开文本文件的路径必须是相对于tests.py等的.这意味着程序在从main.py,路径的原因处理时不会运行.
在将模块导入tests.py之类的时候,我也尝试使用点from ..src.models import *,但是这给出了错误消息,说"尝试在非包中导入相对导入".
我应该在tests.py的顶部放置什么才能从models.py导入模块?
您使用的结构不是我推荐的结构,但我对 Python 项目通常的结构比较陌生。我相信这会满足您的需求:
1) 将文件放入、、 和__init__.py中,以确保它们被视为包。/project/project/src/project/test
2) 放置from __future__ import absolute_import在每个Python 文件的顶部。
3)然后使用相对导入:
test.py:
from ..src import models
Run Code Online (Sandbox Code Playgroud)
main.py:
from .src import models
Run Code Online (Sandbox Code Playgroud)
4) 您需要以不同的方式启动您的应用程序。/project确保您当前的目录是(它似乎是文件系统根目录)的父目录,并以这种方式运行您的项目:
python -m project.main
Run Code Online (Sandbox Code Playgroud)
对于我自己的项目,如果它是您应用程序的起点,我肯定会放入main.py其中。src我也可能会输入tests.py,src但如果没有,我会/project/src在命令行而不是代码中添加到测试运行器的 Python 路径。
不管怎样我仍然会使用absolute_import。根据我的经验,这是一个非常干净的模块组织解决方案,也是 Python 3 中默认的工作方式。