2017-01-19 11 views
6

Jaki jest zamierzony sposób zmiany katalogu przy użyciu funkcji Python pathlib(Documentation)?Jak zmienić katalog za pomocą Pythona pathlib

Załóżmy tworzę Path obiektu następująco:

from pathlib import Path 
path = Path('/etc') 

Obecnie ja po prostu wiem, co następuje, ale to wydaje się podważyć ideę pathlib.

import os 
os.chdir(str(path)) 
+0

Zmiana katalogu bieżącego rzadko jest dobrym pomysłem. Dlaczego musisz zmienić katalog? –

+0

Istnieje mały skrypt bash, który chcę przepisać w Pythonie. W ten sposób łatwiej poradzę sobie z błędami niż wywoływanie zewnętrznego skryptu bash. – Lukas

+0

nie musisz używać 'pathlib' jeśli go nie potrzebujesz -' os.chdir ('/ etc') ' – furas

Odpowiedz

5

Na podstawie uwag zrozumiałem, że pathlib nie pomaga zmieniających katalogi i że zmiany katalogów należy unikać, jeśli to możliwe.

Ponieważ musiałem zadzwonić skrypty bash poza Pythonie z właściwego katalogu, zdecydowałem się za pomocą menedżera kontekstowe dla czystszego sposób zmiany katalogów podobne do tego answer:

import os 
import contextlib 
from pathlib import Path 

@contextlib.contextmanager 
def working_directory(path): 
    """Changes working directory and returns to previous on exit.""" 
    prev_cwd = Path.cwd() 
    os.chdir(path) 
    try: 
     yield 
    finally: 
     os.chdir(prev_cwd) 

Dobrą alternatywą jest użyj parametru cwd klasy subprocess.Popen, jak w tym answer.

Jeśli używasz Python < 3,6 i path jest rzeczywiście pathlib.Path trzeba str(path) w sprawozdaniu chdir.

1

W Pythonie 3.6 lub nowszym os.chdir() może bezpośrednio obsługiwać obiekt Path. W rzeczywistości obiekt Path może zastąpić większość ścieżek str w standardowych bibliotekach.

os. chdir (ścieżka) Zmień bieżący katalog roboczy na ścieżkę.

Ta funkcja może obsługiwać określanie deskryptora pliku. Deskryptor musi odnosić się do otwartego katalogu, a nie do otwartego pliku.

Nowość w wersji 3.3: Dodano obsługę określania ścieżki jako deskryptora pliku na niektórych platformach.

Zmieniono w wersji 3.6: akceptuje path-like object.

import os 
from pathlib import Path 

path = Path('/etc') 
os.chdir(path) 

To może pomóc w przyszłych projektach, które nie muszą być zgodne z 3,5 lub poniżej.

+0

Tak, to naprawdę bardzo miłe. Mam nadzieję, że społeczność Pythona zaakceptuje 'pathlib.Path' w dowolnym miejscu lub całkowicie go porzuci. – Lukas

Powiązane problemy