Почему текущий каталог не находится в sys.path для приложения django

Насколько я понимаю, sys.path имеет текущий каталог (каталог, в котором находится модуль) в качестве первого индекса, однако это кажется несовместимым с django.

У меня есть структура проекта:

В my_file_1.py, печать sys.path дает мне: enter image description here

В my_file_2.py, печать sys.path дает мне: enter image description here

Эти два отпечатка sys.path имеют смысл, поскольку красное подчеркивание - это каталог, в котором находятся модули (их соответствующий текущий каталог).

Однако, в моем приложении django со следующей структурой проекта:

enter image description here

При печати sys.path в urls.py, я получаю:

enter image description here

, который является корневым каталогом проекта, вместо текущего каталога 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

Вернуться на верх