Python, импорт из каталога верхнего уровня не будет работать - PullRequest
0 голосов
/ 13 марта 2020

У меня есть проект со следующей структурой:

/three_Positions_plotting
├── ./requirements.txt
├── ./triangulationapi
├── ./venv
├── ./Project_Level
│   ├── ./Project_Level/__init__.py
│   ├── ./Project_Level/angle_condition.py
│   ├── ./Project_Level/base_objects.py
│   ├── ./Project_Level/consts.py
│   ├── ./Project_Level/database_consts.py
│   ├── ./Project_Level/plot_folium.py
│   ├── ./Project_Level/plot_googleMaps.py
│   ├── ./Project_Level/postgres_queries.py
│   ├── ./Project_Level/test_app.py
│   ├── ./Project_Level/test_cases.py
│   ├── ./Project_Level/test_database.py
│   ├── ./Project_Level/test_utils.py
│   ├── ./Project_Level/utils.py
├── ./triangulationapi/
│   ├── ./triangulationapi/__init__.py
│   ├── ./triangulationapi/manage.py
│   ├── ./triangulationapi/requirements.txt.
│   ├── ./triangulationapi/threelocationstrian
│   ├── ./triangulationapi/find_second_gdt
│   │   ├── ./triangulationapi/find_second_gdt/__init__.py
│   │   ├── ./triangulationapi/find_second_gdt/admin.py
│   │   ├── ./triangulationapi/find_second_gdt/apps.py
│   │   ├── ./triangulationapi/find_second_gdt/migrations
│   │   ├── ./triangulationapi/find_second_gdt/models.py
│   │   ├── ./triangulationapi/find_second_gdt/second_GDT_finding
│   │   ├── ./triangulationapi/find_second_gdt/serializers.py
│   │   ├── ./triangulationapi/find_second_gdt/tests.py
│   │   ├── ./triangulationapi/find_second_gdt/urls.py
│   └   └── ./triangulationapi/find_second_gdt/views.py
│   ├── ./triangulationapi/KnownLocation
│   │   ├── ./triangulationapi/KnownLocation/__init__.py
│   │   ├── ./triangulationapi/KnownLocation/admin.py
│   │   ├── ./triangulationapi/KnownLocation/apps.py
│   │   ├── ./triangulationapi/KnownLocation/migrations
│   │   ├── ./triangulationapi/KnownLocation/models.py
│   │   ├── ./triangulationapi/KnownLocation/serializers.py
│   │   ├── ./triangulationapi/KnownLocation/tests.py
│   │   ├── ./triangulationapi/KnownLocation/urls.py
│   │   └── ./triangulationapi/KnownLocation/views.py
│   ├── ./triangulationapi/landingpage
│   │   ├── ./triangulationapi/landingpage/admin.py
│   │   ├── ./triangulationapi/landingpage/apps.py
│   │   ├── ./triangulationapi/landingpage/__init__.py
│   │   ├── ./triangulationapi/landingpage/migrations
│   │   ├── ./triangulationapi/landingpage/models.py
│   │   ├── ./triangulationapi/landingpage/templates
│   │   ├── ./triangulationapi/landingpage/tests.py
│   │   ├── ./triangulationapi/landingpage/urls.py
│   │   └── ./triangulationapi/landingpage/views.py
│   ├── ./triangulationapi/threelocationstrian
│   │   ├── ./triangulationapi/threelocationstrian/__init__.py
│   │   ├── ./triangulationapi/threelocationstrian/admin.py
│   │   ├── ./triangulationapi/threelocationstrian/apps.py
│   │   ├── ./triangulationapi/threelocationstrian/migrations
│   │   ├── ./triangulationapi/threelocationstrian/models.py
│   │   ├── ./triangulationapi/threelocationstrian/serializers.py
│   │   ├── ./triangulationapi/threelocationstrian/templates
│   │   ├── ./triangulationapi/threelocationstrian/tests.py
│   │   ├── ./triangulationapi/threelocationstrian/urls.py
│   │   └── ./triangulationapi/threelocationstrian/views.py
│   └── ./triangulationapi/triangulationapi
│       ├── ./triangulationapi/triangulationapi/__init__.py
│       ├── ./triangulationapi/triangulationapi/asgi.py
│       ├── ./triangulationapi/triangulationapi/settings.py
│       ├── ./triangulationapi/triangulationapi/urls.py
│       └── ./triangulationapi/triangulationapi/wsgi.py



При попытке импортировать из Project_Level в модели в triangulationapi / .. возникает ошибка.

# triangulationapi/threelocationstrian/views.py

from Project_Level.base_objects import GeoPoint

# Scrip running ...

вывод:

    from Project_Level.base_objects import GeoPoint
ModuleNotFoundError: No module named 'Project_Level'

Это происходит во всем проекте.

и при запуске непосредственно из терминала.

Это клонированный проект, и я работал над другой компьютер с этим проектом и импорт работал.


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'rest_framework.authtoken',
    'threelocationstrian',
    'find_second_gdt',
    'KnownLocation'
]

пытался изменить структуру на:

├── ./triangulationapi
│   ├── ./triangulationapi/find_second_gdt
│   ├── ./triangulationapi/__init__.py
│   ├── ./triangulationapi/KnownLocation
│   ├── ./triangulationapi/landingpage
│   ├── ./triangulationapi/manage.py
│   ├── ./triangulationapi/Project_Level
│   ├── ./triangulationapi/__pycache__
│   ├── ./triangulationapi/templates
│   ├── ./triangulationapi/threelocationstrian
│   └── ./triangulationapi/triangulationapi

до сих пор, когда я запускаю сервер, например:

python3 manage.py runserver
# output
from triangulationapi.Project_Level.angle_condition import MeetAngleCond
ModuleNotFoundError: No module named 'triangulationapi.Project_Level'

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Это довольно специфическая структура каталогов, и, безусловно, есть способ ее исправить, но в целом рекомендуется следовать общей настройке.

Для всех известных мне django проектов это каталог с файлом manage.py, который является верхним уровнем проекта и который должен находиться в пути python, и поэтому не содержит __init__.py

. обычно вы должны импортировать
KnownLocation, landingpage, threelocationstrian и triangulationapi.settings

вместо: triangulationapi.KnownLocation, triangulationapi.landingpage, triangulationapi.threelocationstrian и triangulationapi.triangulationapi.settings

Вы можете проверить и поделиться строками, которые находятся в triangulationapi / triangulationapi / settings.py, и объявить INSTALLED_APPS. В частности, меня интересует, содержит ли INSTALLED_APPS KnownLocation, landingpage, threelocationstrian или содержит triangulationapi.KnownLocation, triangulationapi.landingpage, triangulationapi.threelocationstrian

Не могли бы вы уточнить, что вы имеете в виду под «Верхняя папка (выше Project_level) помечена как источники root. ' Вы используете IDE? Если да, то какой. Вы также можете попробовать прямо из командной строки без какой-либо модной IDE? и введите именно те команды, которые вы вводите, и укажите каталог, в котором вы находитесь.

Обработка ваших последних ответов:

Забавно, что на вашем старом компьютере все работает, по моему мнению на этом компьютере были установлены некоторые переменные env.

Если у вас все еще есть доступ к этому старому компьютеру: перейдите на triangulationapi и наберите echo "$PYTHONPATH", чтобы увидеть, было ли что-то установлено.

Если вы просто хочу, чтобы все работало на вашей новой машине, тогда я бы предложил импортировать в ваш код только из Project_Level и , а не из triangulationapi.Project_Level

Дополнительно перенесите либо Project_Level в каталог triangulationapi (рядом с manage.py) или в качестве альтернативы установите переменную среды PYTHONPATH в родительский каталог Project_Level dir.

Общий комментарий: В общем случае это возникновение проблем с помещением файла __init__.py в каталог, из которого вы выполняете команды (например, manage.py), особенно если родительский каталог был добавлен в путь python и если дочерний каталог имеет то же имя, что и каталог, в котором вы находитесь. В зависимости от порядка импорта python может действительно потеряться.

В качестве общей рекомендации по отладке: вы можете добавить (непосредственно перед строкой, которая не может выполнить импорт) следующий фрагмент. Это может пролить свет на эту проблему.

import sys
print("PATH:\n", "\n".join(sys.path))
for mod, modinfo in sorted(sys.modules.items()):
    print(mod, modinfo)

, в частности, обратите внимание на строки, содержащие triangulationapi

0 голосов
/ 13 марта 2020

Настройте ваши файлы как модули и пакеты. Когда вы импортируете что-то в python в каталоге (убедитесь, что вы находитесь в этом каталоге), он запускает sys.path, который ищет вызываемый файл в родительском каталоге.

...