Получение полного пути к выполняемому Python-скрипту

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для получения пути к исполняемому Python-скрипту мы используем атрибут __file__ и функцию os.path.abspath():

Python
Скопировать код
import os
print(os.path.abspath(__file__))  # Всё проще, чем мы думали, верно?

Этот код выведет полный абсолютный путь до файла с вашим скриптом.

Кинга Идем в IT: пошаговый план для смены профессии

Погружение в детали: что такое __file__ и пути

В Python атрибут __file__ автоматически сохраняет путь к файлу модуля, который может быть представлен как относительным, так и абсолютным путём в зависимости от того, как был запущен скрипт. С помощью os.path.abspath() мы преобразуем этот путь в абсолютный.

А что если в пути есть символические ссылки? В таком случае нам пригодится os.path.realpath():

Python
Скопировать код
import os
print(os.path.realpath(__file__))  # Показываем реальный путь до файла!

Эта функция возвращает реальный путь к файлу, игнорируя символические ссылки.

Кросс-платформенность и обработка символических ссылок

Важно, чтобы ваш код корректно работал на всех операционных системах. Функции модуля os.path успешно справляются с этой задачей, будь то macOS, Windows или Unix/Linux.

Если вам нужна именно директория, где расположен скрипт, а не полный путь к файлу, используйте вместе os.path.dirname() и sys.argv[0]:

Python
Скопировать код
import os
import sys
script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
print(script_dir)  # Вот такое у меня 'родное гнездо'.

Особенности путей при упаковке кода в приложение

Когда код упакован в приложение (например, с помощью py2exe), __file__ может оказаться неработоспособным. В этом случае используйте os.path.dirname(sys.argv[0]):

Python
Скопировать код
import os
import sys
script_path = os.path.dirname(sys.argv[0])
print(os.path.abspath(script_path))  # "Зачем мы падаем? Чтобы научиться подниматься" – Альфред, "Бэтмен: Начало"

Для углублённого понимания работы с путями в Python рекомендую ознакомиться с главой 7.2 книги "Погружение в Python".

Визуализация

Считайте, что os.path.abspath(__file__) — это ваш надёжный робот-помощник 🤖, который всегда знает, где вы находитесь в пространстве кода 🗺️:

Python
Скопировать код
import os
script_path = os.path.abspath(__file__)
Markdown
Скопировать код
Вы (👨‍💻): "Какой у нас сейчас кодовый адрес, дружище?"
Робот (🤖): "Вот текущее положение скрипта —> 🗺️ (script_path)"

Ориентация в пространстве кода становится простой прогулкой!

Потенциальные препятствия

В процессе работы со скриптами могут встретиться неожиданности:

  • __file__ может быть неопределён в интерактивной сессии или при выполнении скрипта из встроенного интерпретатора Python.
  • Отдельно следует уделить внимание ситуациям, когда скрипт запускается с сетевой папки — поведение может отличаться от привычного.
  • Если скрипт выполнен из скомпилированного файла, __file__ будет оканчиваться на .pyc.

Полезные материалы

  1. Как узнать путь к директории со скриптом? — Stack Overflow
  2. os — Модуль для работы с операционной системой — Документация Python
  3. sys — Модуль для работы с системно-зависимыми параметрами и функциями — Документация Python
  4. [Различие между __file__ и sys.argv[0] — Stack Overflow](https://stackoverflow.com/questions/5851588/difference-between-file-and-sys-argv0)
  5. os.path — Модуль для обработки путей к файлам — Документация Python