HOWTO
Come ottenere l'attuale directory dei file degli script in Python
Fornisce l'esempio di codice di come ottenere il percorso del file di script corrente
In questa pagina
Per ottenere la directory che contiene uno script Python in esecuzione, usa os.path.dirname(os.path.abspath(__file__)) oppure Path(__file__).resolve().parent. Entrambe le espressioni partono da __file__, il percorso associato allo script, e ne ricavano la directory contenitore. Usa questa directory per comporre i percorsi dei file che si trovano accanto allo script.
Ottenere la directory dello script corrente
La directory di uno script è la cartella che contiene il suo file .py. __file__ fornisce il percorso dello script; applicando prima os.path.abspath() e poi os.path.dirname() si ottiene il percorso assoluto di una directory. È utile quando lo script deve accedere a un file di configurazione, di input o di dati nelle vicinanze. Se __file__ è relativo, os.path.abspath() lo risolve usando la directory di lavoro del processo, quindi il risultato può dipendere da dove è stato avviato Python. Se __file__ è già assoluto, la directory di lavoro non ne determina la posizione.
Esegui questo esempio da un file Python salvato:
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
import os
script_path = os.path.abspath(__file__)
script_directory = os.path.dirname(script_path)
directory, filename = os.path.split(script_path)
print("Script directory:", script_directory)
print("Directory and filename:", directory, filename)
Script directory: /work
Directory and filename: /work case-0.py
os.path.abspath() rende assoluto il percorso dello script usando il contesto del processo corrente, mentre os.path.dirname() ne estrae la parte corrispondente alla directory. os.path.split() restituisce separatamente la directory e il nome del file. La directory stampata dipende da dove salvi il file, quindi non esiste un output letterale universale da copiare.
Distinguere la directory dello script dalla directory di lavoro
La directory di lavoro è la posizione del processo usata per risolvere i percorsi relativi, come open("data.csv"). Puoi verificarla con os.getcwd(). Può essere la cartella corrente del terminale, un’impostazione dell’IDE oppure una directory scelta da un processo padre. Non coincide necessariamente con la cartella che contiene lo script.
Al contrario, __file__ indica il percorso del file Python in esecuzione. Se uno script si trova in /projects/tool e viene avviato mentre la directory di lavoro è /tmp, l’apertura relativa di data.csv risolve il percorso a partire da /tmp; un percorso costruito a partire dalla directory dello script punta invece a /projects/tool. Scegli la directory di base che corrisponde alla posizione prevista per il file. Se il file si trova accanto allo script, unisci il suo nome alla directory dello script ricavata con os.path.join(script_directory, "data.csv").
Un percorso assoluto ricavato da __file__ non garantisce che il file esista e non risolve ogni questione legata ai collegamenti simbolici o alla distribuzione dell’applicazione. Identifica una posizione da usare come base; verifica o apri il percorso risultante in base alle esigenze dell’applicazione.
Usare os.path per ottenere la directory dello script
L’esempio precedente conserva i valori intermedi, così ogni operazione è chiara. Se serve soltanto la directory contenitore, combina le chiamate in questo modo: os.path.dirname(os.path.abspath(__file__)). Se ti servono entrambe le parti, conserva il risultato di os.path.split() invece di scartare il nome del file.
Per comporre il percorso di un file adiacente, usa os.path.join() anziché concatenare stringhe con una barra. In questo modo Python applica le regole del sistema operativo per i separatori nei percorsi. Per esempio, os.path.join(script_directory, "settings.json") crea un percorso con radice nella directory dello script. Un nome di file relativo passato direttamente a open() viene invece risolto a partire dalla directory di lavoro.
Usare pathlib per ottenere la directory dello script
pathlib esprime la stessa operazione usando oggetti percorso. In uno script salvato, Path(__file__).resolve().parent è la directory contenitore: resolve() ottiene un percorso assoluto risolto e .parent seleziona la cartella che lo contiene. Usa / per aggiungere un percorso figlio, per esempio script_directory / "settings.json", e passa l’oggetto Path risultante alle API che accettano oggetti simili a percorsi, tra cui open().
L’espressione equivalente è Path(__file__).resolve().parent; prima di usarla, importa Path da pathlib. Preferisci pathlib se il codice circostante usa già oggetti Path, e os.path se lavori con stringhe che rappresentano percorsi o con API che le richiedono. Nessuno dei due approcci modifica la directory di lavoro del processo.
Gestire notebook e altri contesti di esecuzione
__file__ è normalmente definita quando Python esegue uno script salvato, ma gli interpreti interattivi e i kernel dei notebook potrebbero non definirla. In questi contesti, le espressioni basate sullo script mostrate sopra non permettono di individuare in modo portabile il file di un notebook. os.getcwd() continua a restituire la directory di lavoro del processo e può aiutare a trovare file relativi alla posizione corrente del kernel, ma non sostituisce il percorso del file sorgente del notebook.
Per un file diverso dallo script in esecuzione, parti dal percorso noto di quel file anziché da __file__, quindi usa os.path.dirname() oppure .parent dell’oggetto Path per ricavarne la directory. Indica esplicitamente la provenienza del percorso, così chi legge in seguito può capire se rappresenta lo script, un altro file o la directory di lavoro del processo.