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
答案 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
作为一个包,将 controllers
和 models
作为不同的模块。
要实现包结构,您需要在根目录中有 __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__.py
和 app
文件夹中的 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'
'
但现在,我希望你能得到解决方案......
注意:=您还会看到其他几个文件,它是由我的 IDE 或 python 本身添加的。因此您无需担心添加这些文件。
my_controller.py 中的代码:-
from app.models import person
person.first()
并且 person.py 模块包含一个名为 first() 的函数
IDE 使用:- PyCharm