[英]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
所以通常你应该导入
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)被标记为源根目录”的含义。 你用的是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.