Python 导入模块、文件夹结构
Posted
技术标签:
【中文标题】Python 导入模块、文件夹结构【英文标题】:Python import modules, folder structures 【发布时间】:2014-01-08 17:30:12 【问题描述】:我一直在寻找解决这个问题的方法。
我有一个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 时,我也尝试使用dots,例如from ..src.models import *
,但出现错误消息“尝试在非包中进行相对导入”。
我应该在 tests.py 的顶部放什么才能从 models.py 中导入模块?
【问题讨论】:
你用的是什么版本的 Python? 【参考方案1】:我不推荐您使用的结构,但我对 Python 项目通常的结构方式比较陌生。我相信这会满足您的需求:
1) 在 /project
、/project/src
和 /project/test
中放置一个 __init__.py
文件,以确保它们被视为包。
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 中默认的工作方式。
【讨论】:
我仍然得到这个:ValueError: Attempted relative import in non-package.我现在到处都有 init.py。 @user1121487 是的。才意识到这一点。对不起。如果您还没有弄清楚,我的编辑应该会修复它。 @user1121487 已更新。你必须以不同的方式运行 Python。我想这解释了为什么我会以不同的方式排列我的文件。 仍然无法正常工作。 ImportError:没有名为模型的模块。 @user1121487 我无法重现。你是怎么得到它的?【参考方案2】:先把你的main.py放到src目录下..
在你的测试中你可以做,sys.path.append('the src directory')
如果您想强制执行在特定目录中,无论您在哪里执行应用程序,我建议您添加
import os
os.chdir('relative path to the src dir')
这样您的程序将在您指定的目录中运行,因此它将尊重您在代码中的相对路径
【讨论】:
以上是关于Python 导入模块、文件夹结构的主要内容,如果未能解决你的问题,请参考以下文章