Получение полного пути к выполняемому Python-скрипту
Быстрый ответ
Для получения пути к исполняемому Python-скрипту мы используем атрибут __file__
и функцию os.path.abspath()
:
import os
print(os.path.abspath(__file__)) # Всё проще, чем мы думали, верно?
Этот код выведет полный абсолютный путь до файла с вашим скриптом.
Погружение в детали: что такое __file__
и пути
В Python атрибут __file__
автоматически сохраняет путь к файлу модуля, который может быть представлен как относительным, так и абсолютным путём в зависимости от того, как был запущен скрипт. С помощью os.path.abspath()
мы преобразуем этот путь в абсолютный.
А что если в пути есть символические ссылки? В таком случае нам пригодится os.path.realpath()
:
import os
print(os.path.realpath(__file__)) # Показываем реальный путь до файла!
Эта функция возвращает реальный путь к файлу, игнорируя символические ссылки.
Кросс-платформенность и обработка символических ссылок
Важно, чтобы ваш код корректно работал на всех операционных системах. Функции модуля os.path
успешно справляются с этой задачей, будь то macOS, Windows или Unix/Linux.
Если вам нужна именно директория, где расположен скрипт, а не полный путь к файлу, используйте вместе os.path.dirname()
и sys.argv[0]
:
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])
:
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__)
— это ваш надёжный робот-помощник 🤖, который всегда знает, где вы находитесь в пространстве кода 🗺️:
import os
script_path = os.path.abspath(__file__)
Вы (👨💻): "Какой у нас сейчас кодовый адрес, дружище?"
Робот (🤖): "Вот текущее положение скрипта —> 🗺️ (script_path)"
Ориентация в пространстве кода становится простой прогулкой!
Потенциальные препятствия
В процессе работы со скриптами могут встретиться неожиданности:
__file__
может быть неопределён в интерактивной сессии или при выполнении скрипта из встроенного интерпретатора Python.- Отдельно следует уделить внимание ситуациям, когда скрипт запускается с сетевой папки — поведение может отличаться от привычного.
- Если скрипт выполнен из скомпилированного файла,
__file__
будет оканчиваться на.pyc
.
Полезные материалы
- Как узнать путь к директории со скриптом? — Stack Overflow
- os — Модуль для работы с операционной системой — Документация Python
- sys — Модуль для работы с системно-зависимыми параметрами и функциями — Документация Python
- [Различие между
__file__
иsys.argv[0]
— Stack Overflow](https://stackoverflow.com/questions/5851588/difference-between-file-and-sys-argv0) - os.path — Модуль для обработки путей к файлам — Документация Python