Как изменить каталог с помощью Python pathlib

Каким образом можно изменить каталог с помощью функции Python pathlib (Documentation)?

Предположим, что я создаю объект Path следующим образом:

from pathlib import Path
path = Path('/etc')

В настоящее время я просто знаю следующее, но это, похоже, подрывает идею pathlib.

import os
os.chdir(str(path))

Ответ 1

На основе комментариев я понял, что pathlib не помогает сменить каталоги и, по возможности, следует избегать изменений каталога.

Поскольку мне нужно было вызвать bash скрипты вне Python из правильного каталога, я решил использовать диспетчер контекста для более чистого способа смены каталогов, подобных этому answer:

import os
import contextlib
from pathlib import Path

@contextlib.contextmanager
def working_directory(path):
    """Changes working directory and returns to previous on exit."""
    prev_cwd = Path.cwd()
    os.chdir(path)
    try:
        yield
    finally:
        os.chdir(prev_cwd)

Хорошей альтернативой является использование параметра cwd класса subprocess.Popen, как в этом .

Если вы используете Python < 3.6 и path, на самом деле это pathlib.Path, вам нужно str(path) в операторах chdir.

Ответ 2

В Python 3.6 или выше os.chdir() может иметь дело с объектом Path. Фактически объект Path может заменить большинство str путей в стандартных библиотеках.

os. chdir (путь) Измените текущий рабочий каталог на путь.

Эта функция может поддерживать указание дескриптора файла. Дескриптор должен ссылаться на открытый каталог, а не на открытый файл.

Новое в версии 3.3: Добавлена ​​поддержка указания пути как файла дескриптор на некоторых платформах.

Изменено в версии 3.6: принимает путь-подобный объект.

import os
from pathlib import Path

path = Path('/etc')
os.chdir(path)

Это может помочь в будущих проектах, которые не должны быть совместимы с 3.5 или ниже.

Ответ 3

Для тех, кто не боится сторонней библиотеки:

$ pip install path.py

затем:

from path import Path

# Changing the working directory:
with Path("somewhere"):
    # cwd in now 'somewhere'
    ...

или если вы хотите сделать это без менеджера контекста:

Path("somewhere").cd()
# cwd in now 'somewhere'

Ответ 4

Использование pathlib (доступно с версии 3.4)

from pathlib import Path
Path("somewhere").cwd()