簡體   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