Как узнать текущую папку в Python: методы и примеры
Основные способы получения текущей директории
Наиболее простой и современный способ - модуль pathlib, появившийся в Python 3.4. Метод Path.cwd() возвращает объект Path, представляющий текущий рабочий каталог. Этот подход является предпочтительным благодаря объектно-ориентированному интерфейсу и лучшей кроссплатформенности.
from pathlib import Path
target_dir = Path.cwd()
print(target_dir) # Пример: /home/user/projects
print(type(target_dir)) #
ввод программ на python (ввод данных в программе python)
Как получить текущий рабочий каталог как строку с использованием os.getcwd()?
Классический вариант - функция os.getcwd() из стандартного модуля os. Она возвращает строку с абсолютным путём.
import os
current = os.getcwd()
print(current) # Абсолютный путь
Python file io (ввод-вывод файлов в python)
Типичная ошибка:
Если текущий каталог был удалён или стал недоступен, вызов os.getcwd() может выбросить исключение FileNotFoundError (в некоторых ОС). В таких случаях следует обработать ошибку с помощью try/except.
Как определить директорию, в которой находится исполняемый скрипт?
Иногда требуется получить папку самого скрипта, а не ту, из которой он был запущен. Для этого используется атрибут __file__ и функция os.path.dirname() или методы pathlib.
import os
from pathlib import Path
# Через os.path
script_dir = os.path.dirname(os.path.abspath(__file__))
print(script_dir)
# Через pathlib (работает и из модуля, и из REPL?)
script_path = Path(__file__).resolve().parent
print(script_path)
Python temp files (временные файлы в python)
Возможная сложность:
При запуске кода в интерактивном интерпретаторе или в некоторых средах (Jupyter Notebook) переменная __file__ может отсутствовать, что вызовет ошибку. Для таких случаев следует проверять наличие __file__.
Как получить реальный путь текущей директории, если она является символической ссылкой?
Функция os.path.realpath() разрешает все символические ссылки и возвращает абсолютный путь. Для pathlib используйте метод resolve().
import os
from pathlib import Path
# os
real = os.path.realpath(os.getcwd())
print(real)
# pathlib
real_path = Path.cwd().resolve()
print(real_path)
Python index files (индексация файлов в python)
Как изменить текущую директорию и затем получить новую?
Используйте os.chdir() для смены каталога и затем вызовите os.getcwd() или Path.cwd() для проверки.
import os
original = os.getcwd()
os.chdir('/tmp')
new = os.getcwd()
print('Новая директория:', new)
os.chdir(original) # Вернуться обратно
File python class (класс для работы с файлами в python)
Потенциальная проблема:
После смены каталога все относительные пути в коде меняются. Рекомендуется сохранять исходный путь для восстановления.
Как получить текущую директорию многопоточного или асинхронного приложения?
В многопоточном коде текущий рабочий каталог является общим для всех потоков (процесса). Вызов os.getcwd() из любого потока вернёт одно и то же значение. Для изоляции путей лучше использовать абсолютные пути.
import threading
import os
def worker():
print('Поток:', threading.current_thread().name, 'директория:', os.getcwd())
threads = []
for i in range(3):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
for t in threads:
t.join()
Результат во всех потоках будет одинаковым, если не было вызова os.chdir() внутри.
Расширенные примеры получения текущей директории
1. Получение директории выполнения скрипта при запуске через cron или планировщик
При автоматическом запуске текущая директория может быть не той, где находится скрипт. Для точного определения используйте __file__.
import os
from pathlib import Path
def get_script_dir():
# Если __file__ определён
if '__file__' in globals():
return os.path.dirname(os.path.abspath(__file__))
else:
# Возвращаем текущую, если __file__ недоступен
return os.getcwd()
script_dir = get_script_dir()
print('Директория скрипта:', script_dir)
Директория скрипта: /home/user/projects/my_script
2. Сравнение путей: абсолютный и текущий
Иногда требуется проверить, входит ли текущая директория в список разрешённых.
import os
from pathlib import Path
allowed = ['/home/user/data', '/var/log']
current = Path.cwd().resolve()
if str(current) in allowed:
print('Текущая директория разрешена')
else:
print('Неразрешённая директория')
Неразрешённая директория
3. Использование pathlib для работы с относительными путями относительно текущей директории
Метод Path.cwd() возвращает абсолютный путь, но можно легко построить относительные пути.
from pathlib import Path
current = Path.cwd()
subdir = current / 'subdir' / 'file.txt'
print('Абсолютный путь:', subdir.resolve())
# Относительный путь от текущей
relative = subdir.relative_to(current)
print('Относительный:', relative)
Абсолютный путь: /home/user/projects/subdir/file.txt Относительный: subdir/file.txt
4. Получение текущей директории и её parent (родительской папки)
from pathlib import Path
current = Path.cwd()
print('Текущая:', current)
print('Родитель:', current.parent)
print('Два уровня вверх:', current.parent.parent)
Текущая: /home/user/projects/app Родитель: /home/user/projects Два уровня вверх: /home/user
5. Обработка исключения FileNotFoundError при недоступности директории
import os
try:
cwd = os.getcwd()
print('Текущая директория:', cwd)
except FileNotFoundError:
print('Директория не найдена (удалена или недоступна)')
except PermissionError:
print('Нет прав на чтение текущей директории')
Текущая директория: /home/user/projects
6. Использование sys.argv[0] для определения директории скрипта без учёта рабочего каталога
Этот метод может быть полезен, когда __file__ не отражает полный путь (например, при запуске с коротким именем).
import os
import sys
script_path = os.path.realpath(sys.argv[0])
script_dir = os.path.dirname(script_path)
print('Директория по sys.argv[0]:', script_dir)
Директория по sys.argv[0]: /home/user/projects
7. Получение текущей директории в однострочном выражении (для передачи в функцию)
import os
def process_directory(path=None):
if path is None:
path = os.getcwd()
print('Обработка:', path)
process_directory()
Обработка: /home/user/projects