Получение директории выполнения скрипта в 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().
Расширенные примеры работы с текущей директорией в 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 возвращает родительскую директорию. Это удобнее строковой конкатенации.