Python pratico

Lanciare uno script con percorso assoluto senza `cd`

14 min di lettura
Numero civico 67 in ottone dorato fissato su un’anta di legno dipinta di verde acqua
Windows macOS Linux
Foto: Ben Prater · Pexels · Licenza Pexels

Come lanciare uno script Python scrivendo il percorso completo, da qualsiasi cartella: virgolette, tilde, cartella corrente e file letti dallo script.

Sei nella cartella dei download, lo script trova_duplicati.py sta in un’altra cartella e il metodo della guida Terminale: comandi minimi per usare gli script di ai riparo è entrare con cd e poi lanciare python3 trova_duplicati.py. Se provi a saltare il cd, Python risponde can't open file ... [Errno 2] No such file or directory. Puoi evitare il cd scrivendo il percorso completo dello script dopo python3: Python trova il file da qualsiasi cartella, ma la cartella corrente resta quella da cui hai lanciato il comando, e questo conta per gli script che aprono file con un nome relativo.

La risposta breve: su Windows scrivi python seguito dal percorso con la lettera dell’unità, su macOS e Linux python3 seguito da un percorso che parte da /. Sotto trovi i tre modi di scrivere quel percorso, gli errori che ho riprodotto e il caso in cui il cd serve ancora.

ℹ️ Nota / Prerequisito operativo: servono un terminale aperto e Python già installato. Ho eseguito i comandi su Debian 13 con bash 5.2.37 e Python 3.13.5, in un ambiente di prova con nome macchina ai-riparo-linux-lab01 e utente utente: i percorsi negli output (come /home/utente/lab-percorso) sono quelli del laboratorio, sul tuo computer saranno diversi. Su Windows e macOS non ho eseguito i comandi: gli esempi per Windows si basano sulla documentazione ufficiale di Python, verificata il 30 ottobre 2026.

Il laboratorio: lo stesso script con e senza percorso completo

Crea una cartella lab-percorso nella tua cartella personale e, dentro, il file mostra_dove.py. Stampa tre cose: il nome con cui l’hai avviato (argv[0], spiegato in sys.argv dentro main()), dove si trova il file e in quale cartella ti trovi tu, cioè la cartella corrente.

import os
import sys
from pathlib import Path


def main():
    print("argv[0]:", sys.argv[0])
    print("file dello script:", Path(__file__).resolve())
    print("cartella corrente:", os.getcwd())


if __name__ == "__main__":
    main()

Apri il terminale in una cartella diversa da lab-percorso; nella prova ho usato Downloads. Prima prova a lanciare lo script con il solo nome. Su Windows (non eseguito):

python mostra_dove.py

Su macOS e Linux:

python3 mostra_dove.py
python3: can't open file '/home/utente/Downloads/mostra_dove.py': [Errno 2] No such file or directory

Python cerca il file nella cartella corrente, e lì non c’è. Ora scrivi il percorso completo. Secondo la documentazione ufficiale di Python sulla riga di comando, lo script dev’essere un percorso del file system, assoluto o relativo. Su Windows (esempio, non eseguito):

python C:\Users\utente\lab-percorso\mostra_dove.py

Su macOS e Linux:

python3 /home/utente/lab-percorso/mostra_dove.py
argv[0]: /home/utente/lab-percorso/mostra_dove.py
file dello script: /home/utente/lab-percorso/mostra_dove.py
cartella corrente: /home/utente/Downloads

Lo script parte. Guarda l’ultima riga: la cartella corrente è ancora Downloads. Il percorso completo ha detto a Python dove sta il file, ma non ti ha spostato.

Terminale Linux nella cartella Downloads: python3 mostra_dove.py senza percorso dà «can't open file» con No such file or directory, mentre python3 con il percorso completo e con ../lab-percorso/ stampa argv[0], il file dello script e la cartella corrente, che resta Downloads
Terminale Linux: da Downloads lo script non si trova con il solo nome, mentre il percorso completo e quello relativo ../lab-percorso/mostra_dove.py lo avviano senza cd. Screenshot: Alex Lunalbi · ai riparo

Tre modi di scrivere il percorso (assoluto, con la tilde, relativo)

Da Downloads ho lanciato mostra_dove.py in tre modi. In tutti e tre la cartella corrente è rimasta /home/utente/Downloads; cambia quello che Python riceve in argv[0]:

Come lo scrivi (macOS e Linux) argv[0] nella prova Come leggerlo
python3 /home/utente/lab-percorso/mostra_dove.py /home/utente/lab-percorso/mostra_dove.py Percorso assoluto: parte da / e vale da qualsiasi cartella.
python3 ~/lab-percorso/mostra_dove.py /home/utente/lab-percorso/mostra_dove.py La tilde ~ è la tua cartella personale: la espande la shell prima che parta Python, per questo argv[0] è già completo.
python3 ../lab-percorso/mostra_dove.py ../lab-percorso/mostra_dove.py Percorso relativo: .. sale di una cartella, quindi dipende da dove ti trovi.

Il percorso assoluto trova lo script da qualsiasi cartella ed è il più facile da salvare in un appunto o in un comando che ripeti. Per ottenerlo senza scriverlo a mano, nella prova realpath ha trasformato il percorso relativo in assoluto:

realpath ../lab-percorso/mostra_dove.py
/home/utente/lab-percorso/mostra_dove.py

Su macOS non ho provato realpath, e su Windows nessun equivalente. Il drag & drop della guida madre è spiegato per le cartelle: trascinare il file .py dopo python3 e uno spazio potrebbe completare il percorso, ma non l’ho provato.

Spazi e tilde tra virgolette: i due errori da copia e incolla

Per provare gli spazi ho copiato mostra_dove.py in una cartella chiamata lab con spazi. Senza virgolette la shell spezza il percorso in tre parole, e Python riceve come script la prima:

python3 /home/utente/lab con spazi/mostra_dove.py
python3: can't open file '/home/utente/lab': [Errno 2] No such file or directory

Con le virgolette doppie la shell passa il percorso intero. Su Windows (esempio, non eseguito) si scrive allo stesso modo:

python "C:\Users\utente\lab con spazi\mostra_dove.py"

Su macOS e Linux:

python3 "/home/utente/lab con spazi/mostra_dove.py"
argv[0]: /home/utente/lab con spazi/mostra_dove.py
file dello script: /home/utente/lab con spazi/mostra_dove.py
cartella corrente: /home/utente/Downloads

Il secondo errore riguarda la tilde. In bash, se la metti tra virgolette non viene espansa, e Python la prende alla lettera come il nome di una cartella:

python3 "~/lab-percorso/mostra_dove.py"
python3: can't open file '/home/utente/Downloads/~/lab-percorso/mostra_dove.py': [Errno 2] No such file or directory

Per Python ~/lab-percorso/... è un percorso relativo, quindi lo cerca dentro Downloads, in una cartella chiamata ~. Hai due correzioni, entrambe provate: tieni la tilde fuori dalle virgolette e racchiudi solo la parte con gli spazi, oppure usa la variabile $HOME dentro le virgolette:

python3 ~/"lab con spazi"/mostra_dove.py
python3 "$HOME/lab-percorso/mostra_dove.py"

Entrambi hanno funzionato. Su macOS la shell predefinita è zsh e non ho provato come tratta la tilde tra virgolette; su Windows ~ e $HOME non fanno parte di questa prova.

La cartella corrente non si sposta con lo script

Dove si trova il file .py e dove ti trovi tu sono due cose diverse. Il percorso completo risolve la prima; la seconda decide dove Python cerca i file che lo script apre con un nome relativo. Per vederlo, accanto a mostra_dove.py ho messo un file dati.txt con una riga di testo e uno script, leggi_dati.py, che lo legge.

Bussola con ghiera color crema e quadrante nero appoggiata su una carta nautica gialla e bianca, con un cinturino di cuoio nero che scende sul foglio
La cartella corrente è il punto in cui ti trovi, anche quando il file dello script sta altrove: il percorso completo non sposta la bussola. Foto: cottonbro studio · Pexels

Questo è leggi_dati.py:

def main():
    with open("dati.txt", encoding="utf-8") as f:
        print(f.read().strip())


if __name__ == "__main__":
    main()

Lanciato da Downloads con il percorso completo (qui con la tilde, su macOS e Linux; su Windows usa python e il percorso con la lettera dell’unità):

python3 ~/lab-percorso/leggi_dati.py
Traceback (most recent call last):
  File "/home/utente/lab-percorso/leggi_dati.py", line 7, in <module>
    main()
    ~~~~^^
  File "/home/utente/lab-percorso/leggi_dati.py", line 2, in main
    with open("dati.txt", encoding="utf-8") as f:
         ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'dati.txt'

Lo script è stato trovato (il traceback cita il suo percorso), ma open("dati.txt") ha cercato il file in Downloads. Hai due strade. Se non puoi toccare lo script, fai cd nella cartella dei dati: nella prova, cd ~/lab-percorso && python3 leggi_dati.py ha stampato la riga di dati.txt. Altrimenti scrivi lo script in modo che trovi i file partendo dalla propria posizione. leggi_dati_ok.py costruisce il percorso da __file__, il percorso del file dello script:

from pathlib import Path

DATI = Path(__file__).resolve().parent / "dati.txt"


def main():
    print(DATI.read_text(encoding="utf-8").strip())


if __name__ == "__main__":
    main()

Da Downloads, python3 ~/lab-percorso/leggi_dati_ok.py ha stampato Questo file sta accanto allo script..

Gli import, invece, funzionano. Secondo la stessa documentazione, quando lanci un file Python la cartella che lo contiene viene aggiunta all’inizio di sys.path, l’elenco dove Python cerca i moduli. Nella prova usa_modulo.py, che fa import saluti con saluti.py nella stessa cartella, è partito da Downloads senza cd:

Ciao dal modulo che sta accanto allo script
Terminale Linux nella cartella Downloads: python3 ~/lab-percorso/leggi_dati.py termina con FileNotFoundError per 'dati.txt', mentre leggi_dati_ok.py stampa il contenuto del file e usa_modulo.py stampa il saluto del modulo importato
Terminale Linux: lo script viene trovato, ma open("dati.txt") cerca nella cartella corrente. Con __file__ il file si trova da qualsiasi cartella, e anche l'import di un modulo accanto allo script funziona. Screenshot: Alex Lunalbi · ai riparo

⚠️ Attenzione — Stessa riga, risultati diversi: se uno script legge o scrive file con nomi relativi, lanciarlo con il percorso completo da una cartella qualsiasi può far fallire la lettura, come nella prova, o far finire nella cartella corrente i file che scrive (questo secondo caso non l’ho provato). Cerca open( nel codice prima di decidere se ti serve il cd.

Venv e cd: cosa cambia e quando scegliere il percorso completo

Il percorso dello script non dice a Python quale ambiente virtuale usare. Con mostra_python.py, che stampa l’interprete in uso e il suo prefix, ho confrontato tre casi da Downloads, dopo aver creato un .venv dentro lab-percorso con python3 -m venv ~/lab-percorso/.venv:

Come lo lanci (macOS e Linux) Interprete nella prova
python3 ~/lab-percorso/mostra_python.py /usr/bin/python3: quello del sistema
~/lab-percorso/.venv/bin/python ~/lab-percorso/mostra_python.py /home/utente/lab-percorso/.venv/bin/python: quello del venv, senza attivarlo
source ~/lab-percorso/.venv/bin/activate, poi python3 ~/lab-percorso/mostra_python.py /home/utente/lab-percorso/.venv/bin/python3: l'attivazione vale per quel terminale, non per la cartella

La documentazione ufficiale di venv conferma che non serve attivare l’ambiente: basta indicare il percorso completo del suo interprete, che si trova in bin su macOS e Linux e in Scripts su Windows. Su Windows (non eseguito) sarebbe, con un venv creato in lab-percorso:

C:\Users\utente\lab-percorso\.venv\Scripts\python.exe C:\Users\utente\lab-percorso\mostra_python.py

Per scegliere tra percorso completo e cd, ecco le regole che ricavo dalle prove sopra:

Situazione Percorso completo senza cd Perché
Lo script non apre file, o li cerca da __file__ come leggi_dati_ok.py Sì Il file si trova da qualsiasi cartella e gli import accanto allo script funzionano.
Lo script apre file con nomi relativi come leggi_dati.py Dipende I file vengono cercati nella cartella corrente: o ti sposti con cd nella cartella dei dati, o correggi lo script.
Lo script lavora sulla cartella in cui ti trovi usa la cartella corrente Sì Con cd vai nella cartella da analizzare e scrivi il percorso completo dello script: la cartella corrente resta quella dei dati.
Hai un venv con i pacchetti dello script senza attivarlo Sì Scrivi il percorso completo dell'interprete del venv prima del percorso dello script.

Errori tipici

  • can't open file '.../mostra_dove.py': [Errno 2] No such file or directory → hai scritto il solo nome ma sei in un’altra cartella, oppure c’è un refuso nel percorso → controlla il percorso con ls (macOS e Linux) o dir (Windows) e scrivilo completo. Nella prova ha dato lo stesso errore anche python3 ~/lab-percorso/mostra_dove, senza .py finale.
  • can't open file '/home/utente/lab' → il percorso contiene spazi e non hai usato le virgolette, quindi Python ha ricevuto solo la prima parola → racchiudi il percorso intero tra virgolette doppie.
  • can't open file '.../Downloads/~/lab-percorso/...' → la tilde era tra virgolette e la shell non l’ha espansa → scrivi ~/ fuori dalle virgolette oppure usa "$HOME/...".
  • FileNotFoundError: ... 'dati.txt' con lo script trovato → lo script apre un file con nome relativo e la cartella corrente è un’altra → fai cd nella cartella dei dati oppure costruisci il percorso con Path(__file__).
  • can't find '__main__' module in '/home/utente/lab-percorso' → hai indicato una cartella al posto del file, e Python cerca dentro un file __main__.py che non c’è → aggiungi il nome del file .py in fondo al percorso.

Domande Frequenti (FAQ)

Come lancio uno script Python senza fare cd?

Scrivi il percorso completo del file dopo il comando: python3 /percorso/dello/script.py su macOS e Linux, python C:\percorso\dello\script.py su Windows. Nella prova su Linux lo script è partito da una cartella diversa dalla sua; su Windows non l’ho eseguito.

Il percorso assoluto cambia la cartella in cui lavora lo script?

No. Nella prova la cartella corrente è rimasta Downloads anche con lo script in lab-percorso. Un open("dati.txt") cerca ancora nella cartella corrente, a meno che lo script non costruisca il percorso da __file__.

Perché Python dice che non trova il file anche se esiste?

Nella prova le cause erano tre: il nome senza percorso da un’altra cartella, gli spazi senza virgolette e la tilde dentro le virgolette. Il messaggio riporta il percorso che Python ha cercato davvero: nelle mie prove indicava già dove stava l’errore.

Posso usare ~ nel percorso dello script?

Su bash sì, se la lasci fuori dalle virgolette: python3 ~/lab-percorso/mostra_dove.py ha funzionato. Tra virgolette no. Su macOS (zsh) e Windows non ho provato.

Come trovo il percorso completo di un file?

Su Linux ho usato realpath nome_file, che stampa il percorso assoluto. In alternativa, la guida madre spiega il drag & drop per le cartelle; con un file non l’ho provato.

Devo attivare il venv se uso il percorso completo?

Non è obbligatorio: puoi scrivere il percorso completo dell’interprete del venv (bin/python su macOS e Linux, Scripts\python.exe su Windows), come conferma la documentazione ufficiale. Se non lo fai, python3 usa l’interprete che trova nel terminale in quel momento.

Il percorso dice dove sta lo script, non dove lavori

Per ricordarlo: il percorso completo trova il file .py, la cartella corrente decide dove lavorano i file con nome relativo. Se vuoi ripassare il caso base, con dir, ls e cd, torna alla guida Terminale: comandi minimi per usare gli script di ai riparo; se ti serve un venv per gli script che avvii da fuori cartella, la guida agli Ambienti virtuali Python (venv) in 5 minuti spiega come crearlo, attivarlo e disattivarlo. Se hai più script sparsi in cartelle diverse e vuoi un modo semplice per avviarli senza ricordare i percorsi, è un lavoro che realizzo su richiesta: te lo dico apertamente perché è un servizio che offro.

Alex Lunalbi

Alex Lunalbi

Security & privacy

Dona su PayPal

Scrivo di sicurezza digitale pratica e codice IA. Su ai riparo ogni procedura è verificata su macchine reali.

Tag
  • python,
  • terminale,
  • percorsi,
  • script