Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 我是否需要在指向我的类的目录树中的每个目录中放置_init__u;.py?_Django_Python 3.x_Import_Module - Fatal编程技术网

Django 我是否需要在指向我的类的目录树中的每个目录中放置_init__u;.py?

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 但我得到了这个错误

我正在用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
但我得到了这个错误

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文件,但正如您所预测的,同样的错误也发生了。