8

Эквивалент команды 'cd' в оболочке для смены рабочей директории?

3

Описание проблемы

Я сталкиваюсь с задачей изменения текущего рабочего каталога в Python. В терминале для этого используется команда cd, но не знаю, как это сделать в коде Python.

Как я могу изменить текущий рабочий каталог в Python?

5 ответ(ов)

1

Вопрос: Как можно легко реализовать контекстный менеджер для изменения текущей директории с использованием генераторов и декораторов?

Ответ: Вы можете создать контекстный менеджер cd с помощью модуля contextlib. Этот менеджер изменяет текущую рабочую директорию на указанную и автоматически возвращает её обратно после выхода из контекста, даже если в блоке кода возникает исключение.

Вот пример реализации:

from contextlib import contextmanager
import os

@contextmanager
def cd(newdir):
    prevdir = os.getcwd()  # Сохраняем текущую директорию
    os.chdir(os.path.expanduser(newdir))  # Меняем на новую директорию
    try:
        yield  # Возвращаем управление в блок with
    finally:
        os.chdir(prevdir)  # Возвращаем обратно в предыдущую директорию

Использование этого контекстного менеджера довольно простое:

os.chdir('/home')  # Устанавливаем текущее рабочее место

with cd('/tmp'):
    # Ваш код здесь...
    raise Exception("There's no place like /home.")  # Исключение выбрасывается
# После выхода из блока 'with' текущая директория вернется назад к '/home'.

Таким образом, после завершения работы с контекстным менеджером, даже если было выброшено исключение, текущая директория вернется обратно, что позволяет избежать потенциальных проблем, связанных с изменением директории в процессе выполнения программы.

0

Как уже упомянули другие участники, все приведенные выше решения просто меняют рабочий каталог текущего процесса. Это изменение теряется, когда вы выходите обратно в Unix-оболочку. Если вы в отчаянии, вы можете изменить каталог родительской оболочки в Unix с помощью этого ужасного хака:

def quote_against_shell_expansion(s):
    import pipes
    return pipes.quote(s)

def put_text_back_into_terminal_input_buffer(text):
    # использование этого метода подразумевает, что он работает только в интерактивной сессии
    # (если пользователь начнет вводить текст во время исполнения, он может вставить символы между символами в 'text'!)
    import fcntl, termios
    for c in text:
        fcntl.ioctl(1, termios.TIOCSTI, c)

def change_parent_process_directory(dest):
    # ужас
    put_text_back_into_terminal_input_buffer("cd "+quote_against_shell_expansion(dest)+"\n")

Учтите, что этот метод является очень нестандартным и может привести к неожиданным последствиям, поэтому используйте его с осторожностью!

0

Использование os.chdir() является правильным подходом.

0

Функция os.chdir() в Python является аналогом команды cd в Unix-подобных системах. Она используется для изменения текущей рабочей директории процесса выполнения. Если вам нужно перейти в другую директорию внутри вашего скрипта, вы можете использовать os.chdir('/path/to/directory').

Например:

import os

# Изменяем текущую рабочую директорию
os.chdir('/path/to/directory')

# Проверяем текущую директорию
print(os.getcwd())  # выведет: /path/to/directory

При использовании os.chdir() важно учитывать, что изменение рабочей директории влияет только на текущий процесс и не затрагивает другие активно исполняемые процессы.

0

Вы можете использовать как os.chdir(abs_path), так и os.chdir(rel_path), не обязательно вызывать os.getcwd(), чтобы использовать относительный путь. Ваша программа изменит текущую рабочую директорию на абсолютный путь, а затем на относительный, и это будет работать корректно. Просто учитывайте, что при использовании относительного пути путь будет интерпретироваться относительно текущей директории.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь