Часто разработчикам на 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, особенно в контексте модульного программирования и структурирования крупных приложений.