Как мне изменить каталог (CD) в Python? - PullRequest
598 голосов
/ 10 января 2009

cd как в команде оболочки для изменения рабочего каталога.

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

Ответы [ 14 ]

654 голосов
/ 10 января 2009

Вы можете изменить рабочий каталог с помощью:

import os

os.chdir(path)

При использовании этого метода необходимо следовать двум рекомендациям:

  1. Перехватить исключение (WindowsError, OSError) по неверному пути. Если выдается исключение, не выполняйте никаких рекурсивных операций, особенно деструктивных. Они будут действовать по старому пути, а не по новому.
  2. Вернитесь в старый каталог, когда закончите. Это можно сделать безопасным для исключения способом, заключив ваш вызов chdir в менеджер контекста, как это сделал Брайан М. Хант в своем ответе .

Изменение текущего рабочего каталога в подпроцессе не приводит к изменению текущего рабочего каталога в родительском процессе. Это верно и для интерпретатора Python. Вы не можете использовать os.chdir() для изменения CWD вызывающего процесса.

282 голосов
/ 02 ноября 2012

Вот пример менеджера контекста для изменения рабочего каталога. Это проще, чем ActiveState версия , о которой говорится в другом месте, но это делает работу.

Диспетчер контекста: cd

import os

class cd:
    """Context manager for changing the current working directory"""
    def __init__(self, newPath):
        self.newPath = os.path.expanduser(newPath)

    def __enter__(self):
        self.savedPath = os.getcwd()
        os.chdir(self.newPath)

    def __exit__(self, etype, value, traceback):
        os.chdir(self.savedPath)

Или попробуйте более краткий эквивалент (ниже) , используя ContextManager .

Пример

import subprocess # just to call an arbitrary command e.g. 'ls'

# enter the directory like this:
with cd("~/Library"):
   # we are in ~/Library
   subprocess.call("ls")

# outside the context manager we are back wherever we started.
132 голосов
/ 10 января 2009

Я бы использовал os.chdir так:

os.chdir("/path/to/change/to")

Кстати, если вам нужно выяснить ваш текущий путь, используйте os.getcwd().

Подробнее здесь

101 голосов
/ 12 июня 2014

cd() легко написать с помощью генератора и декоратора.

from contextlib import contextmanager
import os

@contextmanager
def cd(newdir):
    prevdir = os.getcwd()
    os.chdir(os.path.expanduser(newdir))
    try:
        yield
    finally:
        os.chdir(prevdir)

Затем каталог возвращается даже после возникновения исключения:

os.chdir('/home')

with cd('/tmp'):
    # ...
    raise Exception("There's no place like home.")
# Directory is now back to '/home'.
23 голосов
/ 11 января 2009

Если вы используете относительно новую версию Python, вы также можете использовать менеджер контекста, например this :

from __future__ import with_statement
from grizzled.os import working_directory

with working_directory(path_to_directory):
    # code in here occurs within the directory

# code here is in the original directory

UPDATE

Если вы предпочитаете бросать свои собственные:

import os
from contextlib import contextmanager

@contextmanager
def working_directory(directory):
    owd = os.getcwd()
    try:
        os.chdir(directory)
        yield directory
    finally:
        os.chdir(owd)
13 голосов
/ 22 мая 2013

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

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

def put_text_back_into_terminal_input_buffer(text):
    # use of this means that it only works in an interactive session
    # (and if the user types while it runs they could insert characters between the characters in 'text'!)
    import fcntl, termios
    for c in text:
        fcntl.ioctl(1, termios.TIOCSTI, c)

def change_parent_process_directory(dest):
    # the horror
    put_text_back_into_terminal_input_buffer("cd "+quote_against_shell_expansion(dest)+"\n")
12 голосов
/ 10 января 2009

os.chdir() правильный путь.

12 голосов
/ 10 января 2009

os.chdir() - это Pythonic версия cd.

6 голосов
/ 02 июля 2013

Далее в направлении, указанном Брайаном и основанном на sh (1.0.8 +)

from sh import cd, ls

cd('/tmp')
print ls()
4 голосов
/ 10 октября 2016

Если вы хотите выполнить что-то вроде опции "cd ..", просто наберите:

os.chdir ("..")

это так же, как в Windows cmd: cd .. Конечно, import os необходим (например, введите его как 1-ю строку вашего кода)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...