Получение директории выполнения скрипта в Python

Раздел: Системное администрирование -> Файловый ввод-вывод

Получение текущей рабочей директории в Python

Основное решение: os.getcwd() и pathlib.Path.cwd()

Наиболее эффективный способ узнать текущий рабочий каталог (Current Working Directory, CWD) в Python - использовать встроенный модуль os или современный pathlib. Оба подхода возвращают абсолютный путь к директории, в которой выполняется интерпретатор Python.

Пример с os:


import os
current_dir = os.getcwd()
print(current_dir)

ввод программ на python (ввод данных в программе python)

Пример с pathlib:


from pathlib import Path
current_dir = Path.cwd()
print(current_dir)

Python file io (ввод-вывод файлов в python)

Результат выполнения (пример):

/home/user/project

Python temp files (временные файлы в python)

Оба вызова возвращают строку (в случае os) или объект Path (в случае pathlib). Рекомендуется использовать pathlib в новых проектах, так как он предоставляет более удобный интерфейс для работы с путями.

Как получить текущую директорию с помощью os.getcwd() и обработать ошибки?

Функция os.getcwd() может выбросить исключение FileNotFoundError или PermissionError, если текущий каталог был удалён или недоступен. Пример с обработкой:


import os
try:
    cwd = os.getcwd()
except (FileNotFoundError, PermissionError) as e:
    print(f"Не удалось получить текущую директорию: {e}")

Python index files (индексация файлов в python)

Типичная ошибка:

После удаления директории, в которой находится процесс, os.getcwd() может вернуть путь к уже несуществующему каталогу. В таких случаях лучше проверять существование через os.path.exists().

Как получить текущую директорию с помощью pathlib.Path.cwd() и преобразовать в строку?

Объект Path легко конвертируется в строку:


from pathlib import Path
cwd = Path.cwd()
str_cwd = str(cwd)
print(f"Объект: {cwd}, строка: {str_cwd}")

File python class (класс для работы с файлами в python)

Проблема: совместимость с функциями, ожидающими строку

Многие старые библиотеки требуют строку, поэтому преобразование str(cwd) может быть необходимо. Метод Path.as_posix() возвращает путь с прямой косой чертой, что полезно для кросс‑платформенности.

Как получить директорию текущего скрипта, а не рабочую директорию?

Рабочая директория может отличаться от местоположения запускаемого файла. Для получения папки самого скрипта используют __file__:


import os
script_dir = os.path.dirname(os.path.abspath(__file__))
print(script_dir)

Python file utf 8 (кодировка utf-8 для файлов в python)

С pathlib:


from pathlib import Path
script_dir = Path(__file__).resolve().parent
print(script_dir)

Python config files (конфигурационные файлы в python)

Ошибка при запуске интерактивно или из IDE

Если Python запущен в интерактивном режиме, __file__ может быть не определён. В таких случаях альтернативой служит os.getcwd() или модуль inspect.

Как разрешить символические ссылки при получении текущей директории?

Если текущая рабочая директория является символической ссылкой, os.getcwd() возвращает путь по ссылке. Для получения реального (физического) пути используйте os.path.realpath():


import os
real_cwd = os.path.realpath(os.getcwd())
print(real_cwd)

Python copy file (копирование файла в python)

Альтернатива с pathlib:


from pathlib import Path
real_cwd = Path.cwd().resolve()
print(real_cwd)

Python log file (логирование в файл в python)

Не путать с os.path.abspath()

os.path.abspath() не разрешает симлинки, а только нормализует путь. Для разрешения симлинков необходим realpath или resolve.

Как получить текущую директорию без использования os или pathlib?

Теоретически можно использовать sys.path[0] (первый элемент - часто CWD), но это ненадёжно. Пример:


import sys
cwd_sys = sys.path[0] if sys.path else '.'
print(cwd_sys)

Этот способ не рекомендуется, так как sys.path изменяется при установке пакетов или импортах. Используйте официальные функции.

Проблема с пустым sys.path

В редких конфигурациях sys.path может не содержать CWD. Всегда предпочтительней os.getcwd().

- File handle python (обработка файлов в python)
- Python open file read (открытие файла для чтения в python)
- Python file position (позиционирование в файле python)

Расширенные примеры работы с текущей директорией в Python

Пример 1: Получение реального пути при изменении директории внутри программы

Пример

import os
import tempfile

# Создаём временную директорию и переходим в неё
with tempfile.TemporaryDirectory() as tmpdir:
    os.chdir(tmpdir)
    print("Текущая (через os.getcwd):", os.getcwd())
    # Создаём символическую ссылку внутри временной папки
    link_name = os.path.join(tmpdir, "mylink")
    real_target = os.path.join(tmpdir, "subdir")
    os.makedirs(real_target, exist_ok=True)
    os.symlink(real_target, link_name, target_is_directory=True)
    os.chdir(link_name)
    print("После перехода по ссылке (getcwd):", os.getcwd())
    print("После перехода по ссылке (realpath):", os.path.realpath(os.getcwd()))
Текущая (через os.getcwd): /tmp/tmpXXXXXX
После перехода по ссылке (getcwd): /tmp/tmpXXXXXX/mylink
После перехода по ссылке (realpath): /tmp/tmpXXXXXX/subdir

Пояснение:

os.chdir() меняет CWD. Если перейти по символической ссылке, os.getcwd() показывает путь через ссылку, а os.path.realpath() - физический путь.

Пример 2: Сравнение производительности os.getcwd() и Path.cwd()

Пример

import timeit
import os
from pathlib import Path

# Замеры времени
time_os = timeit.timeit('os.getcwd()', globals=globals(), number=100000)
time_path = timeit.timeit('Path.cwd()', globals=globals(), number=100000)
print(f"os.getcwd(): {time_os:.4f} сек")
print(f"Path.cwd():  {time_path:.4f} сек")
os.getcwd(): 0.1125 сек
Path.cwd():  0.1243 сек

Результат:

Оба метода очень быстры, разница несущественна. Path.cwd() возвращает объект, что может быть удобнее для дальнейших манипуляций.

Пример 3: Получение текущей директории при запуске скрипта из cron без терминала

Пример

#!/usr/bin/env python3
import os
import sys

# В cron HOME может быть не установлен, поэтому полагаемся на os.getcwd()
cwd = os.getcwd()
print(f"Текущая директория (из cron): {cwd}")
# Можно также использовать переменную окружения PWD, но она не всегда обновляется
pwd_env = os.environ.get('PWD', 'не задана')
print(f"Переменная PWD: {pwd_env}")
Текущая директория (из cron): /home/user/scripts
Переменная PWD: /home/user/scripts

Примечание:

В cron CWD часто устанавливается в домашнюю директорию пользователя или в корень проекта - зависит от настроек задачи. Использование os.getcwd() гарантирует актуальное значение.

Пример 4: Обработка случая, когда текущий каталог удалён

Пример

import os
import tempfile

# Создаём временную директорию, переходим в неё, затем удаляем её
with tempfile.TemporaryDirectory() as tmpdir:
    os.chdir(tmpdir)
    # Удаляем директорию через файловую систему (tmpdir удалится при выходе из контекста)
    # Но мы смоделируем удаление до выхода
    # Внимание: это может привести к ошибке, но для примера используем os.rmdir
    # (на практике такое не рекомендуется)
    # Вместо этого покажем, как проверить существование
    if not os.path.exists(tmpdir):
        print("Директория уже удалена")
    try:
        cwd = os.getcwd()
        print(f"CWD: {cwd}")
    except FileNotFoundError:
        print("Текущая директория не существует!")
CWD: /tmp/tmpXXXXXX (или ошибка, если директория уже удалена)

Рекомендация:

Перед вызовом os.getcwd() в критичных сценариях стоит проверять существование директории через os.path.exists() или оборачивать вызов в блок try/except.

Пример 5: Получение абсолютного пути относительно текущей директории

Пример

import os

relative_path = "data/config.json"
abs_path = os.path.abspath(relative_path)
print(f"Относительный путь: {relative_path}")
print(f"Абсолютный путь: {abs_path}")
Относительный путь: data/config.json
Абсолютный путь: /home/user/project/data/config.json

Пояснение:

os.path.abspath() использует os.getcwd() неявно, поэтому не требуется вызывать её отдельно.

Пример 6: Использование pathlib для построения путей на основе CWD

Пример

from pathlib import Path

cwd = Path.cwd()
log_file = cwd / "logs" / "app.log"
print(f"Путь к логу: {log_file}")
print(f"Существует ли родительская папка? {log_file.parent.exists()}")
Путь к логу: /home/user/project/logs/app.log
Существует ли родительская папка? False

Пояснение:

Оператор / в pathlib объединяет пути. Метод .parent возвращает родительскую директорию. Это удобнее строковой конкатенации.

Получение текущей рабочей директории в Python - comments

En
Python текущая директория (python)