Переменная __file__

 

Часто разработчикам на Python необходимо узнать путь и имя файла, который в данный момент выполняется. Это может быть полезно в множестве случаев, например, когда один скрипт вызывает другой, и требуется узнать путь и имя файла, в котором выполняется код.

Эту информацию легко получить, зная о существовании служебного атрибута __file__  — это специальная переменная, которая содержит путь к скрипту, который был запущен. Значение, которое хранится в переменной __file__ будет зависеть от версии интерпретатора, который вы используете. Если у вас версия python от 3.9 в __file__ будет храниться абсолютное значение пути, в более старых версиях - относительный путь.

Переменная __file__ особенно полезна для определения пути каталога, из которого был запущен модуль, можно назвать его базовым каталогом. Знать адрес базового каталога полезно, потому что через него с помощью относительных путей можно получить  доступ к остальным ресурсам вашего приложения, таким как записи данных, шаблоны или файлы настройки.

Вот как найти базовый каталог

import os
dir_base = os.path.dirname(os.path.abspath(__file__))
print(f"Script directory: {dir_base}")

Обратите внимание на наличие os.path.abspath в этом скрипте. Так как в разных версиях мы имеем дело то с абсолютным путем то с относительным. А нам необходимо в любом случае иметь дело с абсолютным путем, поэтому использование данной функции предохраняет от падения программы в более ранних версиях python.

Также переменную __file__ можно часто увидеть в сценариях логирования файлов, чтобы определять быть полезно из какого файла в файл лога попадало событие или для создания отдельного файла лога

import logging
logging.basicConfig(level=logging.INFO)
logging.info(f"Running script from: {__file__}") 

__file__ также помогает в отладке, поскольку разработчики могут быстро определить, из какого файла был вызван код, и каковы его относительные зависимости. Следовательно, знание о работе переменной __file__ является ключевым для организации и управления проектами на Python, особенно в контексте модульного программирования и структурирования крупных приложений.

Перейти к следующему шагу

Комментарии