Python 3.11+contextlibпонятие
contextlib.chdir
менеджеры
Контекстный менеджер: временно меняет текущий рабочий каталог, восстанавливая его на выходе (Python 3.11+).
Синтаксис
with contextlib.chdir(path): ...
Меняется рабочий каталог всего процесса, а не отдельного потока, поэтому в многопоточном или асинхронном коде соседние потоки и задачи внезапно увидят чужой каталог — документация прямо отмечает, что менеджер не потокобезопасен. Вложенность при этом безопасна: он реентерабельный и запоминает предыдущий каталог на каждом входе. В обычном коде надёжнее просто складывать абсолютные пути, а chdir беречь для случаев, когда чужая библиотека умеет работать только с текущим каталогом.
Примеры
import contextlib
import os
cm = contextlib.chdir('.')
print(hasattr(cm, '__enter__') and hasattr(cm, '__exit__')) # → True
with contextlib.chdir('.') as v: print(v) # → None
before = os.getcwd()
with contextlib.chdir('..'): print(os.getcwd() == os.path.dirname(before)) # → True
print(os.getcwd() == before) # → True
with contextlib.chdir('no_such_dir'): pass # → FileNotFoundError
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности