Как узнать текущую папку в 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() внутри.

- Python copy file (копирование файла в python)
- Python log file (логирование в файл в python)
- Python file methods (методы работы с файлами в python)

Расширенные примеры получения текущей директории

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
  

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

En
Python get directory (python)