Question Comment changer de répertoire (cd) en Python?


cd comme dans la commande shell pour changer le répertoire de travail.

Comment changer le répertoire de travail actuel en Python?


503
2018-01-10 20:28


origine


Réponses:


Vous pouvez changer le répertoire de travail avec:

import os

os.chdir(path)

Il existe deux bonnes pratiques à suivre lors de l'utilisation de cette méthode:

  1. Attrapez l'exception (WindowsError, OSError) sur le chemin non valide. Si l'exception est levée, n'effectuez aucune opération récursive, en particulier destructive. Ils opéreront sur l'ancien chemin et non sur le nouveau.
  2. Retournez dans votre ancien répertoire lorsque vous avez terminé. Cela peut se faire de manière exceptionnellement sûre en enveloppant votre appel chdir dans un gestionnaire de contexte, comme Brian M. Hunt l'a fait dans sa réponse.

La modification du répertoire de travail en cours dans un sous-processus ne modifie pas le répertoire de travail en cours dans le processus parent. Cela est également vrai de l'interpréteur Python. Vous ne pouvez pas utiliser os.chdir() changer le CWD du processus appelant.


546
2018-01-10 20:41



Voici un exemple de gestionnaire de contexte pour modifier le répertoire de travail. C'est plus simple qu'un Version ActiveState mentionné ailleurs, mais cela fait le travail.

Gestionnaire de contexte: 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)

Ou essayez le plus concis équivalent (ci-dessous), en utilisant ContextManager.

Exemple

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



j'utiliserais os.chdir comme ça:

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

En passant, si vous avez besoin de comprendre votre chemin actuel, utilisez os.getcwd().

Plus ici


124
2018-01-10 20:43



cd() est facile à écrire en utilisant un générateur et un décorateur.

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)

Ensuite, le répertoire est restauré même après qu'une exception est levée:

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 vous utilisez une version relativement nouvelle de Python, vous pouvez également utiliser un gestionnaire de contexte, tel que celui-là:

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

METTRE À JOUR

Si vous préférez rouler vous-même:

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() est la bonne façon.


11
2018-01-10 20:34



Comme déjà souligné par d’autres, toutes les solutions ci-dessus ne changent que le répertoire de travail du processus en cours. Ceci est perdu lorsque vous revenez au shell Unix. Si vous désespérez pouvez changer le répertoire du shell parent sur Unix avec ce hack horrible:

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