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 等。这意味着程序在执行时不会运行ma​​in.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 导入模块、文件夹结构的主要内容,如果未能解决你的问题,请参考以下文章

python如何导入自定义模块

Python模块创建,安装,导入,使用

python导入模块

如何在python3中正确导入同一目录下的模块

用Python正确导入文件/模块

Python 动态导入模块