Эквивалент команды 'cd' в оболочке для смены рабочей директории?
Описание проблемы
Я сталкиваюсь с задачей изменения текущего рабочего каталога в Python. В терминале для этого используется команда cd
, но не знаю, как это сделать в коде Python.
Как я могу изменить текущий рабочий каталог в Python?
5 ответ(ов)
Вопрос: Как можно легко реализовать контекстный менеджер для изменения текущей директории с использованием генераторов и декораторов?
Ответ: Вы можете создать контекстный менеджер 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'.
Таким образом, после завершения работы с контекстным менеджером, даже если было выброшено исключение, текущая директория вернется обратно, что позволяет избежать потенциальных проблем, связанных с изменением директории в процессе выполнения программы.
Как уже упомянули другие участники, все приведенные выше решения просто меняют рабочий каталог текущего процесса. Это изменение теряется, когда вы выходите обратно в 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")
Учтите, что этот метод является очень нестандартным и может привести к неожиданным последствиям, поэтому используйте его с осторожностью!
Использование os.chdir()
является правильным подходом.
Функция 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()
важно учитывать, что изменение рабочей директории влияет только на текущий процесс и не затрагивает другие активно исполняемые процессы.
Вы можете использовать как os.chdir(abs_path)
, так и os.chdir(rel_path)
, не обязательно вызывать os.getcwd()
, чтобы использовать относительный путь. Ваша программа изменит текущую рабочую директорию на абсолютный путь, а затем на относительный, и это будет работать корректно. Просто учитывайте, что при использовании относительного пути путь будет интерпретироваться относительно текущей директории.
Как изменить порядок столбцов в DataFrame?
Получение текущей даты в формате YYYY-MM-DD в Python
Как проверить тип NoneType в Python?
Как удалить пакеты, установленные с помощью easy_install в Python?
Использование @property против геттеров и сеттеров