Почему текущий каталог не находится в sys.path для приложения django
Насколько я понимаю, sys.path
имеет текущий каталог (каталог, в котором находится модуль) в качестве первого индекса, однако это кажется несовместимым с django.
У меня есть структура проекта:
В my_file_1.py
, печать sys.path
дает мне:
В my_file_2.py
, печать sys.path
дает мне:
Эти два отпечатка sys.path имеют смысл, поскольку красное подчеркивание - это каталог, в котором находятся модули (их соответствующий текущий каталог).
Однако, в моем приложении django со следующей структурой проекта:
При печати sys.path в urls.py, я получаю:
, который является корневым каталогом проекта, вместо текущего каталога urls.py, который должен быть c:\\Users\\5403\\Desktop\\tutorial\\tutorial
Может кто-нибудь объяснить это несоответствие и поправить меня, если я что-то неправильно понял, спасибо.
Django изменяет sys.path
, чтобы он содержал корневой каталог проекта, так что такие вещи как import mysite.settings
должны работать везде в вашем проекте.
Обратитесь к документации django здесь
Кроме того, Python позволяет модифицировать sys.path
. Из Python docs
Программа может свободно изменять этот список для своих целей. Только строки и байты должны быть добавлены в sys.path; все остальные типы данных игнорируются при импорте.
Если ваша цель - получить директорию, в которой находится urls.py, вы должны использовать подход, который django использует в своем файле settings.py.
BASE_DIR = Path(__file__).resolve().parent.parent
Рассмотрим следующий пример:
code00.py:
#!/usr/bin/env python
import os
import sys
from pprint import pprint as pp
import inner.code01
pp({os.path.abspath(__file__): sys.path[:4]})
code01.py (находится в dir под названием inner, рядом с code00.py):
#!/usr/bin/env python
import os
import sys
from pprint import pprint as pp
pp({os.path.abspath(__file__): sys.path[:4]})
Выход:
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q073104391]> sopr.bat ### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ### [prompt]> tree /a /f Folder PATH listing for volume SSD0-WORK Volume serial number is AE9E-72AC E:. | code00.py | \---inner | code01.py | \---__pycache__ code01.cpython-39.pyc [prompt]> [prompt]> "e:\Work\Dev\VEnvs\py_pc064_03.09_test0\Scripts\python.exe" inner/code01.py {'e:\\Work\\Dev\\StackOverflow\\q073104391\\inner\\code01.py': ['e:\\Work\\Dev\\StackOverflow\\q073104391\\inner', 'e:\\Work\\Dev\\Utils\\current', 'e:\\Work\\Dev\\Utils', 'c:\\Install\\pc064\\Python\\Python\\03.09\\python39.zip']} [prompt]> [prompt]> "e:\Work\Dev\VEnvs\py_pc064_03.09_test0\Scripts\python.exe" ./code00.py {'e:\\Work\\Dev\\StackOverflow\\q073104391\\inner\\code01.py': ['e:\\Work\\Dev\\StackOverflow\\q073104391', 'e:\\Work\\Dev\\Utils\\current', 'e:\\Work\\Dev\\Utils', 'c:\\Install\\pc064\\Python\\Python\\03.09\\python39.zip']} {'e:\\Work\\Dev\\StackOverflow\\q073104391\\code00.py': ['e:\\Work\\Dev\\StackOverflow\\q073104391', 'e:\\Work\\Dev\\Utils\\current', 'e:\\Work\\Dev\\Utils', 'c:\\Install\\pc064\\Python\\Python\\03.09\\python39.zip']}
При запуске модуля напрямую, Python добавляет его расположение (как 1st запись) в [Python.Docs]: sys.path (поведение по умолчанию). При импорте это (естественно) не происходит.
В вашем случае происходит то же самое, когда вы запускаете модули напрямую, их расположение находится в sys.path (вы можете проверить это, запустив urls.py).
Итак, нет никакого несоответствия со стороны Django (не имеет к этому никакого отношения) или Python, но со стороны того, как вы работаете с модулями.
Если вам действительно нужен urls.py в sys.path (хотя если бы это было действительно необходимо, это было бы сделано Django автоматически), добавьте его либо:
Вручную
Из файла конфигурации Django