Python导入模块、文件夹结构
我一直在寻找解决这个问题的方法 我有一个python项目,这是我想要的文件夹结构:Python导入模块、文件夹结构,python,path,relative-path,python-module,Python,Path,Relative Path,Python Module,我一直在寻找解决这个问题的方法 我有一个python项目,这是我想要的文件夹结构: /project/main.py /project/src/models.py /project/test/tests.py 我希望能够通过在终端中执行tests.py来运行测试。tests.py导入/project/src/中的模块进行测试。首先,我通过添加 sys.path.insert(0,…')在tests.py中。但是,在models.py中用于打开文本文件的路径必须与tests.py等相关,这意味着
/project/main.py
/project/src/models.py
/project/test/tests.py
我希望能够通过在终端中执行tests.py来运行测试。tests.py导入/project/src/中的模块进行测试。首先,我通过添加
sys.path.insert(0,…')
在tests.py中。但是,在models.py中用于打开文本文件的路径必须与tests.py等相关,这意味着程序在超出main.py时无法运行,这是路径的原因
在将模块导入tests.py时,我也尝试了使用点,比如从..src.models import*导入模块,但这会给出错误消息“尝试在非包中进行相对导入”
为了能够从models.py导入模块,我应该在tests.py的顶部添加什么?我不推荐您使用的结构,但我是一个比较新的Python项目的结构。我相信这会满足你的要求: 1) 在
/project
、/project/src
和/project/test
中放置一个\uuuu init\uuuuuuuuuuuuuuupy
文件,以确保它们被视为包
2) 在每个Python文件的顶部放置来自_ufuture _uuimport absolute(绝对导入)的
3) 然后使用相对导入:
test.py
:
from ..src import models
from .src import models
main.py
:
from ..src import models
from .src import models
4) 您需要以不同的方式启动应用程序。确保当前目录是/project
(似乎是文件系统根目录)的父目录,并按以下方式运行项目:
python -m project.main
对于我自己的项目,如果它是应用程序的起点,我肯定会将main.py
放在src
中。我可能也会将tests.py
放在src
中,但如果没有,我会将/project/src
添加到命令行上测试运行程序的Python路径,而不是代码中
不管怎样,我仍然会使用absolute\u import
。根据我的经验,这是一个非常干净的模块组织解决方案,也是Python 3中默认情况下的工作方式。首先将main.py放在src目录中
在测试中,您可以执行sys.path.append('src目录')
如果您希望强制执行在特定目录中,而不管您从何处执行应用,我建议您添加
import os
os.chdir('relative path to the src dir')
这样,您的程序将在您指定的目录中运行,因此它将尊重您在代码中拥有的相对路径您使用的Python版本是什么?我仍然得到以下信息:ValueError:尝试在非包中进行相对导入。我现在到处都有init.py。@user1121487是的。我才意识到。很抱歉如果您还没有弄清楚,我的编辑应该会修复它。@user1121487已更新。您必须以不同的方式运行Python。我想这就解释了为什么我会以不同的方式安排我的文件,但仍然无法让它工作。ImportError:没有名为models的模块。@user1121487我无法复制它。你怎么知道的?