Rozdział 15 · Python i akta
Obecny katalog roboczy jest CWD
Jednym z najczęstszych źródeł błędów plików: względna ścieżka nie prowadzi tam, gdzie myślałeś.
Bieżący katalog roboczy (CWD)
Sprawdź aktualny katalog roboczy programu:
cwd.py
from pathlib import Path
print(Path.cwd())
Bieżący katalog roboczy (CWD) jest folderem względem którego, Zwykłe ścieżki względne w programie są interpretowane.
CWD NIE jest „folderem skryptów”
To jeden z najczęstszych błędów związanych ze ścieżkami w rzeczywistym kodzie. CWD oraz folder, w którym znajduje się plik
.py, może się pokrywać lub nie. CWD jest determinowane przez fakt, że skąd program został uruchomiony, a nie tam, gdzie fizycznie znajduje się jej plik źródłowy. project/ ← CWD (uruchomienie python src/app.py stąd)
src/
app.py
data/
config.json
app_py_fragment.py
# w src/app.py jeśli program jest uruchamiany od project/:
from pathlib import Path
путь = Path("data/config.json")
# oznacza project/data/config.json – NIE project/src/data/config.json
Debug Lab 2: CWD nie jest folderem skryptów
app_wrong.py
# plik jest w project/src/app.py
from pathlib import Path
config = Path("config.json") # załóżmy: „obok scenariusza”
print(config.read_text(encoding="utf-8"))
$ cd project
$ python src/app.py
Traceback (most recent call last):
FileNotFoundError: [Errno 2] No such file or directory: 'config.json'
Plik config.json leży w project/src/obok skryptu. Ale program jest uruchamiany z project/ oznacza, że CWD równa się project/oraz ścieżka względna "config.json" jest poszukiwane w project/config.jsonto nie istnieje.
Poprawiony kod
app_fixed.py
# niezawodny sposób to ścieżka względem samego pliku, a nie względem CWD
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
config = BASE_DIR / "config.json"
print(config.read_text(encoding="utf-8"))
Folder skryptów: __file__
Dla zwykłych .py-plików, sprawdź folder, w którym był oryginał
Możesz to zrobić tak:
script_dir.py
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
__file__ nie zawsze jest gwarantowane
__file__ jest zwykle definiowana w zwykłych skryptach i modułach, ale interaktywna powłoka Python i niektóre środowiska laptopowe mogą nie ustawiać tej zmiennej. Nie uważaj jej za uniwersalnie dostępną w żadnym kontekście wykonywania kodu.Praktyka: CWD i folder skryptów na komputerze
Praktyka lokalna – uruchamiaj prawdziwy plik . py- z różnych folderów i obserwuj, co się zmienia
Praktyka kursuje lokalnie