Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python导入模块、文件夹结构_Python_Path_Relative Path_Python Module - Fatal编程技术网

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等相关,这意味着

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

我有一个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等相关,这意味着程序在超出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我无法复制它。你怎么知道的?