Django 我是否需要在指向我的类的目录树中的每个目录中放置_init__u;.py?
我正在用Python 3.6构建一个Django项目。我已经创建了这个目录结构Django 我是否需要在指向我的类的目录树中的每个目录中放置_init__u;.py?,django,python-3.x,import,module,Django,Python 3.x,Import,Module,我正在用Python 3.6构建一个Django项目。我已经创建了这个目录结构 project - manage.py - scripts - run_commands.py - commons - util - __init__.py - my_class.py init.py的内容如下 from . import my_class 在另一个类中,我尝试像这样导入MyClass from commons.util import MyClass 但我得到了这个错误
project
- manage.py
- scripts
- run_commands.py
- commons
- util
- __init__.py
- my_class.py
init.py的内容如下
from . import my_class
在另一个类中,我尝试像这样导入MyClass
from commons.util import MyClass
但我得到了这个错误
ModuleNotFoundError: No module named 'commons'
我是否正确地创建了我的init.py?过去的情况是,是的,您需要在每个将被视为python模块的目录中放置一个
\uuuu init\uuuuuuuuuuupy
python不会在该目录中查找可导入的代码
- project
- __init__.py
- commons
- __init__.py
- util
- __init__.py
- my_class.py
但正如下文所指出的,这是一个错误。因此,根据您的Python版本,您需要做出明智的决定
注意,您可能需要或不需要根项目
目录中的\uuuu init\uuuu.py
(如果您需要它们),这取决于它是否具有作为源代码树一部分的定义。但如果它只是一个容器,你就不需要它了,比如你在Django项目的组织方式中看到的
。
问题似乎是
MyClass
不在commons.util
中,因为您只导入了名为myu class
的模块,而不是类本身
相反,文件commons/util/_init_uuu.py
应包含以下导入:
from .my_class import MyClass
我不认为这会解决你的问题,因为你会得到一个不同于所示的错误,但最终你会得到错误
更新
首先,我建议阅读本文,以获得有关导入在python中如何工作的良好解释
基本上,当您从commons.util import MyClass执行时,解释器会扫描sys.path
中名为commons
的模块的内容
我假设您没有将sys.path
设置为包含项目文件夹,因此出现了ModuleNotFoundError
TLDR;您有两种选择:
- 在
run\u commands.py
中手动设置sys.path
以检查项目文件夹(不要这样做!)
- 使用Django的类
要使用Django的命令
类,您需要调整项目文件夹,如下所示:
project
- manage.py
- commons
- management
- commands
run_commands.py
- util
- __init__.py
- my_class.py
python3 manage.py run_commands
现在在run_commands.py中:
from django.core.management.base import BaseCommand
from commons.util import MyClass
class Command(BaseCommand):
def handle(*args, **options):
print("handling", MyClass)
您可以使用以下命令执行新命令:
project
- manage.py
- commons
- management
- commands
run_commands.py
- util
- __init__.py
- my_class.py
python3 manage.py run_commands
非常感谢。是否需要将任何内容放入commons目录下的init.py文件中?不需要,为了使模块可导入,它们都可以为空。谢谢。奇怪的是,我仍然收到一个“ModuleNotFoundError:No module named'commons'”的空文件错误。我甚至试着做“init.py”util目录中的文件为空。使用空的\uu init\uuuuuuuuuuuuuuuuuupy
文件,您需要对导入进行完整的限定,例如:from commons.util.my_uclass import MyClass
,但鉴于错误是从commons
触发的,我怀疑您有一个配置错误的Django项目,而不管\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy
的情况如何。如果您没有使用startproject
,您应该重新开始。对于Python3.3+来说,这根本不是真的。您试图从哪个模块导入MyClass
?你能给我看一下目录结构吗?@Monica,目录结构已经更新了。我正在尝试使用“run_commands.py”文件中的导入。感谢您的帮助。我首先运行“source venv/bin/activate”来激活我的虚拟环境,然后运行“python scripts/run_commands.py myarg1 myarg2”。我确实尝试按照您的建议编辑init.py文件,但正如您所预测的,同样的错误也发生了。