【问题标题】:django.setup() giving me ModuleNotFoundError: when ran in pycharmdjango.setup() 给我 ModuleNotFoundError: when running in pycharm
【发布时间】:2021-02-17 01:13:00
【问题描述】:

我已经为该项目设置了一个 django 项目和一个应用程序,如下所示。 更改模型后,我可以进行迁移和迁移。 我可以运行服务器,并且管理页面按预期显示我的应用程序。 我能够运行 python manage.py shell,在 shell 中导入和操作我的模型。

但是,当我尝试从另一个 python 文件(在 pycharm 中)导入我的模型时,我收到一条错误消息,指出找不到我的应用程序的模块。

操作系统:

Distributor ID: LinuxMint
Description:    Linux Mint 19.3 Tricia
Release:    19.3
Codename:   tricia

IDE

PyCharm 2020.2.3 (Community Edition)
Build #PC-202.7660.27, built on October 6, 2020
Runtime version: 11.0.8+10-b944.34 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Linux 5.4.0-52-generic
GC: ParNew, ConcurrentMarkSweep
Memory: 1871M
Cores: 8
Non-Bundled Plugins: Statistic, com.alayouni.ansiHighlight, com.intellij.ideolog, org.toml.lang, ru.meanmail.plugin.requirements, com.jetbrains.plugins.ini4idea
Current Desktop: X-Cinnamon

Python:

python 3.6

姜戈

Django==3.1.3

我已经阅读了之前的相关问题:django-modulenotfounderror-no-module-named-restaurantsdjango-modulenotfounderror,但我认为我的问题有些不同。

我没有移动文件或更改文件夹名称,我真的尽量按照教程保留它(我什至从 django doc 重新创建了 exat poll 应用程序示例并得到了同样的错误)。

我想这与我的环境变量设置不正确有关,但我对这一切都很陌生,我不完全了解我应该检查什么,我应该如何检查这些以及最后如何检查这些被固定。因此,如果问题与环境变量有关,我将不胜感激。谢谢!

在 pycharm 中,我有几个用于该项目的存储库,它们保存在一个文件夹中,我通常打开包含 pycharm 中所有存储库的文件夹。 这里感兴趣的 repo 称为 'static_data',它包含以下树:

├── backend
│   ├── manage.py
│   ├── static_data_app
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── migrations
│   │   │   └── 0001_initial.py
│   │   ├── models.py
│   │   ├── tests.py
│   │   ├── tools
│   │   │   ├── loading.py
│   │   │   ├── new_expiry.py
│   │   │   └── setup.py
│   │   ├── urls.py
│   │   └── views.py
│   └── static_data_project
│       ├── asgi.py
│       ├── settings.py
│       ├── urls.py
│       └── wsgi.py
├── __init__.py
├── README.md
└── test.py

我已经设置好了 static_data_project/settings.py

INSTALLED_APPS = [
    'static_data_app.apps.StaticDataAppConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

然后当我尝试在 pycharm 中运行 static_data/test.py 时,其中包含以下代码:

import os
import sys
import django

os.environ['DJANGO_SETTINGS_MODULE'] = 'static_data.backend.static_data_project.settings'
django.setup()

from static_data.backend.static_data_app.models import Asset

if __name__ == '__main__':
    my_list = list(Asset.objects.all())
    print(my_list)

这就是我得到的 (提醒一下,在 pycharm 中,我将所有存储库都放在某个文件夹中,并且此处感兴趣的存储库称为 'static_data'

/home/[...]/env/bin/python3.6 /home/[...]/static_data/test.py
Traceback (most recent call last):
  File "/home/[...]/static_data/test.py", line 6, in <module>
    django.setup()
  File "/home/[...]/env/lib/python3.6/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/[...]/env/lib/python3.6/site-packages/django/apps/registry.py", line 91, in populate
    app_config = AppConfig.create(entry)
  File "/home/[...]/env/lib/python3.6/site-packages/django/apps/config.py", line 116, in create
    mod = import_module(mod_path)
  File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 941, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'static_data_app'

Process finished with exit code 1

【问题讨论】:

    标签: python python-3.x django pycharm


    【解决方案1】:

    如果您的导入相对于项目目录(包含 manage.py 的目录),您会发现它会容易得多

    os.environ['DJANGO_SETTINGS_MODULE'] = 'static_data_project.settings'
    django.setup()
    
    from static_data_app.models import Asset
    

    如果您将test.py 文件移动到项目目录中,我认为应该可以。如果你将test.py文件保留在原处,那么你需要在调用django.setup()之前将项目目录添加到Python路径中:

    import sys
    sys.path.append('/path/to/backend')
    

    【讨论】:

    • 那行得通。非常感谢!后端位于名为 static_data 的存储库中,该存储库位于包含我也使用的其他存储库的文件夹“工作区”中。我正在将'/path/to/workspace'添加到sys.path,我认为这会起作用(因为后端位于工作空间内的static_data内)但它没有,我没有考虑只添加后端的路径(我不完全理解 sys.path 的工作原理)。
    • 与项目相关的导入问题:当我这样做时,我的 IDE (pycharm) 正在抱怨(只是以红色突出显示,没什么大不了的)。它确实阻止我运行程序或其他任何东西,但我只是想知道是否应该做些什么来阻止 pycharm 抱怨它?
    • sys.path.append('/path/to/backend') 正在将 backend 目录添加到 Python 路径。当你(比如说)from static_data_app.models import Asset 时,Python 会搜索 Python 路径下的所有目录,并在backend 目录中找到static_data_app 模块。
    • 您应该能够在 PyCharm 中为您的项目配置 Python 路径以包含 backend 目录,但我无法帮助您。
    • 我将 '/path/to/workspace' 添加到 sys.path,我认为这会起作用 - 您的许多 Django 代码假定项目目录位于蟒蛇路径。例如,当 Django 尝试从您的 INSTALLED_APPS 加载 static_data_app.apps.StaticDataAppConfig 时,会导致您的回溯中的错误。
    猜你喜欢
    • 2022-12-02
    • 2022-12-02
    • 2022-08-05
    • 1970-01-01
    • 2021-04-08
    • 2019-03-07
    • 1970-01-01
    • 2021-01-15
    • 2013-02-25
    相关资源
    最近更新 更多