[英]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.