Pregunta ¿Cómo cambio el directorio (cd) en Python?


cd como en el comando de shell para cambiar el directorio de trabajo.

¿Cómo cambio el directorio de trabajo actual en Python?


503
2018-01-10 20:28


origen


Respuestas:


Puede cambiar el directorio de trabajo con:

import os

os.chdir(path)

Hay dos mejores prácticas a seguir cuando se utiliza este método:

  1. Captura la excepción (WindowsError, OSError) en una ruta no válida. Si se lanza la excepción, no realice ninguna operación recursiva, especialmente destructiva. Operarán en el camino viejo y no en el nuevo.
  2. Regrese a su directorio anterior cuando haya terminado. Esto se puede hacer de una manera segura para excepciones al envolver su llamada chdir en un administrador de contexto, como hizo Brian M. Hunt en su respuesta.

Cambiar el directorio de trabajo actual en un subproceso no cambia el directorio de trabajo actual en el proceso principal. Esto también es cierto para el intérprete de Python. No puede utilizar os.chdir() para cambiar el CWD del proceso de llamada.


546
2018-01-10 20:41



Aquí hay un ejemplo de un administrador de contexto para cambiar el directorio de trabajo. Es más simple que un Versión ActiveState referido a otro lugar, pero esto hace el trabajo.

Administrador de contexto: 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)

O prueba el equivalente más conciso (abajo), utilizando ContextManager.

Ejemplo

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.

253
2017-11-02 15:00



yo usaría os.chdir Me gusta esto:

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

Por cierto, si necesita descubrir su ruta actual, use os.getcwd().

Más aquí


124
2018-01-10 20:43



cd() es fácil de escribir usando un generador y un decorador.

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)

Luego, el directorio se revierte incluso después de lanzar una excepción:

os.chdir('/home')

with cd('/tmp'):
    # ...
    raise Exception("There's no place like home.")
# Directory is now back to '/home'.

78
2018-06-12 03:30



Si está utilizando una versión relativamente nueva de Python, también puede usar un administrador de contexto, como éste:

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

ACTUALIZAR

Si prefieres tirar el tuyo:

import os
from contextlib import contextmanager

@contextmanager
def working_directory(directory):
    owd = os.getcwd()
    try:
        os.chdir(directory)
        yield directory
    finally:
        os.chdir(owd)

21
2018-01-10 21:02



os.chdir() es el camino correcto.


11
2018-01-10 20:34



Como ya se señaló por otros, todas las soluciones anteriores solo cambian el directorio de trabajo del proceso actual. Esto se pierde cuando sales de nuevo al shell de Unix. Si te desesperas poder cambie el directorio del shell principal en Unix con este horrible truco:

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")

11
2018-05-22 14:48



os.chdir() es la versión pitonica de cd.


11
2018-01-10 20:34



Más allá en la dirección señalada por Brian y basada en sh (1.0.8+)

from sh import cd, ls

cd('/tmp')
print ls()

6
2017-07-02 13:50



Si desea realizar algo como la opción "cd ..", simplemente escriba:

os.chdir ("..") 

es lo mismo que en Windows cmd: cd .. Por supuesto importación os es necesario (por ejemplo, tipearlo como 1.ª línea de tu código)


4
2017-10-10 18:05