繁体   English   中英

Python,从上层目录导入将不起作用

[英]Python, Imports from upper level directory won't work

我有一个具有以下结构的项目:

/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'

这是一个非常特殊的目录结构,肯定有办法修复它,但总的来说,遵循一般设置是个好主意。

对于所有 django 项目,我知道它是包含 manage.py 文件的目录,这是项目的顶层,应该在 python 路径中,因此包含__init__.py

所以通常你应该导入
KnownLocationlandingpagethreelocationstriantriangulationapi.settings

代替: triangulationapi.KnownLocationtriangulationapi.landingpagetriangulationapi.threelocationstriantriangulationapi.triangulationapi.settings

你能验证和共享在 triangulationapi/triangulationapi/settings.py 中的行并声明 INSTALLED_APPS。 特别是我感兴趣INSTALLED_APPS是否包含KnownLocationlandingpagethreelocationstrian或者它是否包含triangulationapi.KnownLocationtriangulationapi.landingpagetriangulationapi.threelocationstrian

您能否详细说明“顶级文件夹(高于 Project_level)被标记为源根目录”的含义。 你用的是IDE吗? 如果是哪一个。 您也可以在没有任何花哨的 IDE 的情况下直接从命令行尝试吗? 并准确键入您键入的命令并提及您所在的目录。

处理您的最新答案:

令人困惑的是,在您的旧机器上工作正常,在我看来,这台机器上设置了一些环境变量。

如果您仍然可以访问这台旧机器: cd 到triangulationapi并键入echo "$PYTHONPATH"以查看是否设置了某些内容。

如果你只是想让你的新机器上的东西工作,那么我建议只从Project_Level不是triangulationapi.Project_Level导入你的代码

此外,将Project_Level移动到triangulationapi目录(在manage.py旁边)或将环境变量PYTHONPATH设置为Project_Level目录的父目录。

一般评论:通常,将__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

将您的文件设置为模块和包。 当您在目录中的 python 中导入某些内容时(确保您在该目录中),它会触发sys.path ,它会在父目录中查找被调用的文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM