С Python я сталкиваюсь достаточно редко. В основном, для работы с разнообразными, в том числе и самописными, API, но иногда случается «питонить» и какие-то прикладные штуковины. Это особенно актуально в средах ОС Linux. Даже при всём моём уважении к бесконечно простому и мощнейшему bash, программы на Python порою «читать» намного проще. В любом случае, это только моё и сугубо субъективное мнение…
Сегодня речь пойдёт о получении пути, из которого была запущена программа, написанная на Python. Иными словами — получение рабочего каталога. Избалованный магией других языков программирования, я был достаточно сильно удивлен, когда скомпилированная из py-скрипта программа умудрилась скачать файлы в какие-то настолько непроходимые дебри файловой системы, что я до сих пор их так и не смог найти. И это совсем не смешно.
Никаких особых путей в коде программы я не указывал и ожидал, что всё будет располагаться в папке рядом с программой, но не тут-то было… Именно это натолкнуло меня на написание особой функции, которая могла бы вернуть мне путь к рабочему каталогу программы вне зависимости от её типа.
Функция get_program_directory() возвращает полный путь к папке, как для скрипта, так и для скомпилированной программы:
import os
import sys
def get_program_directory():
if getattr(sys, 'frozen', False):
# Если программа запущена как exe, возвращаем путь к исполняемому файлу
program_dir = os.path.dirname(sys.executable)
else:
# Если программа запущена в обычном режиме
program_dir = os.path.dirname(os.path.abspath(__file__))
return program_dir
Вызвать функцию можно стандартно. Например, с помощью print:
print(get_program_directory())
Для полноценной демонстрации запихну весь код в отдельный скрипт и назову его test.py:
# Импорт библиотек
import os
import sys
# Функция для получения папки со скриптом
def get_program_directory():
if getattr(sys, 'frozen', False):
# Если программа запущена как exe, возвращаем путь к исполняемому файлу
program_dir = os.path.dirname(sys.executable)
else:
# Если программа запущена в обычном режиме
program_dir = os.path.dirname(os.path.abspath(__file__))
return program_dir
# Вызов функции
print(get_program_directory())
Теперь запущу скрипт:

Print() вывел в консоль результат работы функции и теперь можно творить с этой информацией что угодно.