当我尝试导入包时出现 ModuleNotFoundError

时间:2021-03-22 15:54:54

标签: python

my_controller.py 如下:

from models import Person

david = Person('David')

我的项目结构是

app
├── controller
│   └── my_controller.py
│   
└── models
    └── __init__.py
    └── person.py

我必须做错什么,因为我一直在搞定

ModuleNotFoundError: No module named 'models'    

将 Person 类导入 my_controller.py 的正确方法是什么?

PS 我正在开发 ubuntu

6 个答案:

答案 0 :(得分:1)

你需要使用相对导入

  - import_role:
      name: "{{ step }}"

或者最好导入您将使用的模型,因为它不会在视觉上与 django.db.models 发生冲突。

from . import models

您也不需要在类 from django import forms from .models import VolunteerBasicInfo class BasicInfoCollectionForm(forms.ModelForm): class Meta: model = VolunteerBasicInfo ... 中使用方括号。

答案 1 :(得分:0)

我假设您将 app 作为一个包,将 controllersmodels 作为不同的模块。

要实现包结构,您需要在根目录中有 __init__.py,即此处的 app 和每个模块中的 __init__.py

之后,您可以在其他模块中导入一个模块的函数/类,而无需相对导入。

我使用上述建议测试了问题中存在的相同结构。

结构如下:

├── app
├── __init__.py
├── controllers
   ├── __init__.py
   ├── my_c.py
└── models
   ├── __init__.py
   └── my_m.py

  • 所有的 __init__.py 都是空的。

  • my_m.py 的内容是:

class Person:
    def test_model(self):
        x = "Model Imported"
        return x
  • my_c.py 的内容是:
from models.my_m import Person

test = Person()
print(test.test_model())
  • 执行时:

    • python3 -m controllers.my_c 应用内
  • 输出为:

    • Model Imported

如果有帮助,请告诉我。

答案 2 :(得分:0)

如果您不想更改任何结构并希望执行 my_controller.py,则需要附加对公共文件夹的访问权限,以便它可以导入任何相邻的模块。

import sys
import os

sys.path.append(os.path.abspath(os.path.join(
    os.path.dirname(__file__), '..')
))

from models.person import Person

x = Person()

答案 3 :(得分:0)

如果您只是在 shell 中运行该文件,则它非常简单。这个想法是你想从你的“根”目录在项目中启动它。

首先,在 __init__.py 目录中添加一个空的 app/ 文件。

其次,将 my_controller.py 中的导入更改为 from models.person,而不仅仅是 from models

from models.person import Person

david = Person('David')

最后,cd 到 app/ 目录,然后运行这个坏小子。

$ python3 -m controller.my_controller.py

如果这不起作用,那么也将您的 PYTHONPATH 设置为 /app,如下所示:

export PYTHONPATH=$PYTHONPATH:/my/dir/app/venv/bin

然后再次尝试第一个 bash 命令。

答案 4 :(得分:0)

如果您的文件夹结构如下...

app
├── __init__.py
│   
├── controller
│   └── my_controller.py
│   └── __init__.py
│   
└── models
    └── __init__.py
    └── person.py

您的根目录是 app 文件夹,您可以在 my_controller.py...

from app.models.person import Person

if __name__ == '__main__':
    david = Person('David')

然后如果你在 shell 中运行程序,你首先导航到 app 的父文件夹并使用...

PYTHONPATH=. python app/controller/my_controller.py

您似乎缺少 __init__.pyapp 文件夹中的 controller 以及正确的导入路径。

为什么使用这种方法

__init__.py 文件是将其他文件夹中的代码视为 Python 模块并允许导入所必需的文件。 if __name__ == '__main__': 不是必需的,但很好的做法,阅读更多,例如here。现在您可能会问自己 PYTHONPATH=. 是什么意思。它将您以 root 身份执行代码的位置设置为文件夹。使用它,您需要 from <root>.<subfolder>.<file> import <class> 作为导入路径。这有助于您保持干净的导入结构,显示项目的完整范围,并使添加 tests 文件夹变得容易:)

希望能帮到你!

答案 5 :(得分:0)

Directory Structure like yours

当我尝试这个时,起初我遇到了和你一样的错误 经过多次调试尝试,我发现其中一个 _init_.py 包含一些我没有添加的异常代码它是:from models import person

所以当我从那里删除它时,它运行成功,但只有当我从根目录运行它时,如下图所示。

即使我尝试了几种方法来从当前工作目录运行它,方法是将 cwd 更改为“app”或在我的情况下为“practice”,但随后它开始向我显示错误 ModuleNotFoundError: No module named 'app' '

但现在,我希望你能得到解决方案......

Output

注意:=您还会看到其他几个文件,它是由我的 IDE 或 python 本身添加的。因此您无需担心添加这些文件。

my_controller.py 中的代码:-

from app.models import person

person.first()

并且 person.py 模块包含一个名为 first() 的函数

IDE 使用:- PyCharm

相关问题