854 Stimmen

Äquivalent zum Shell-Befehl "cd", um das Arbeitsverzeichnis zu wechseln?

cd ist der Shell-Befehl zum Wechseln des Arbeitsverzeichnisses.

Wie kann ich das aktuelle Arbeitsverzeichnis in Python ändern?

941voto

Michael Labbé Punkte 11449

Sie können das Arbeitsverzeichnis mit ändern:

import os

os.chdir(path)

Bei der Anwendung dieser Methode sind zwei bewährte Verfahren zu beachten:

  1. Fangen Sie die Ausnahme (WindowsError, OSError) bei ungültigem Pfad ab. Wenn die Ausnahme ausgelöst wird, führen Sie keine rekursiven Operationen durch, insbesondere keine destruktiven. Sie wirken auf den alten Pfad und nicht auf den neuen.
  2. Kehren Sie anschließend in Ihr altes Verzeichnis zurück. Dies kann auf eine ausnahmesichere Weise geschehen, indem man den chdir-Aufruf in einen Kontextmanager verpackt, wie Brian M. Hunt es in seine Antwort .

Ein Wechsel des aktuellen Arbeitsverzeichnisses in einem Unterprozess ändert nicht das aktuelle Arbeitsverzeichnis im übergeordneten Prozess. Dies gilt auch für den Python-Interpreter. Sie können nicht mit os.chdir() um den CWD des Aufrufprozesses zu ändern.

362voto

Brian M. Hunt Punkte 75888

Hier ist ein Beispiel für einen Kontextmanager zum Ändern des Arbeitsverzeichnisses. Es ist einfacher als ein ActiveState-Version auf die an anderer Stelle verwiesen wird, aber damit ist die Sache erledigt.

Kontext-Manager: 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)

Oder versuchen Sie die knappere Entsprechung (unten) , mit 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.

167voto

cdunn2001 Punkte 16591

cd() ist mit Hilfe eines Generators und eines Dekorators leicht zu schreiben.

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)

Dann wird das Verzeichnis auch nach dem Auftreten einer Ausnahme wiederhergestellt:

os.chdir('/home')

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

155voto

Evan Fosmark Punkte 93825

Ich würde verwenden os.chdir wie diese:

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

Übrigens, wenn Sie Ihren aktuellen Pfad herausfinden wollen, verwenden Sie os.getcwd() .

Mehr aquí

27voto

Brian Clapper Punkte 24335

Wenn Sie eine relativ neue Version von Python verwenden, können Sie auch einen Kontextmanager verwenden, wie z.B. diese :

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

Wenn Sie es vorziehen, Ihre eigene Rolle zu drehen:

import os
from contextlib import contextmanager

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X