You are here: Partenza > Dive Into Python > Programmazione orientata ai dati > Trovare il percorso | << >> | ||||
Dive Into PythonPython per programmatori esperti |
Quando lanciate gli script Python da linea di comando, qualche volta torna utile sapere dov'è localizzato lo script corrente sul disco fisso.
Questo è uno degli oscuri e piccoli trucchi che sono virtualmente impossibili da imparare da soli, ma semplici da ricordare una volta visti. La chiave è nel sys.argv. Come abbiamo visto in Elaborare XML, sys.argv è una lista contenente gli argomenti da linea di comando. Comunque, contiene anche il nome dello script corrente, esattamente come se fosse chiamato da linea di comando, e questa è un'informazione sufficiente per determinarne la locazione.
Se non lo avete ancora fatto, potete scaricare questo ed altri esempi usati in questo libro.
import sys, os print 'sys.argv[0] =', sys.argv[0] pathname = os.path.dirname(sys.argv[0]) print 'path =', pathname print 'full path =', os.path.abspath(pathname)
os.path.abspath richiede ulteriori spiegazioni. È molto flessibile; può prendere ogni tipo di percorso.
>>> import os >>> os.getcwd() /home/f8dy >>> os.path.abspath('') /home/f8dy >>> os.path.abspath('.ssh') /home/f8dy/.ssh >>> os.path.abspath('/home/f8dy/.ssh') /home/f8dy/.ssh >>> os.path.abspath('.ssh/../foo/') /home/f8dy/foo
I percorsi e i nomi di file che passate a os.path.abspath non è necessario che esistano. |
os.path.abspath non realizza solo percorsi completi, si occupa anche di normalizzarli. Se siete nella directory /usr/, os.path.abspath('bin/../local/bin') ritornerà /usr/local/bin. Se volete solo normalizzare un percorso senza trasformarlo in un percorso completo, usate invece os.path.normpath. |
[f8dy@oliver py]$ python /home/f8dy/diveintopython/common/py/fullpath.py sys.argv[0] = /home/f8dy/diveintopython/common/py/fullpath.py path = /home/f8dy/diveintopython/common/py full path = /home/f8dy/diveintopython/common/py [f8dy@oliver diveintopython]$ python common/py/fullpath.py sys.argv[0] = common/py/fullpath.py path = common/py full path = /home/f8dy/diveintopython/common/py [f8dy@oliver diveintopython]$ cd common/py [f8dy@oliver py]$ python fullpath.py sys.argv[0] = fullpath.py path = full path = /home/f8dy/diveintopython/common/py
Come altre funzioni nei moduli os e os.path, anche os.path.abspath è multi-piattaforma. I vostri risultati sembreranno leggermente differenti dai miei esempi se state lavorando su Windows (che usa i backslash come separatori di percorso) o sul Mac OS (che usa due punti), ma funzionano comunque. Questo è il punto cruciale del modulo os. |
Appendice. Un lettore era insodddisfatto di questa soluzione, voleva poter lanciare tutti i test delle unità di codice nella directory corrente, non in quella dove si trovava regression.py. Suggerì quest'altro approccio:
import sys, os, re, unittest def regressionTest(): path = os.getcwd() sys.path.append(path) files = os.listdir(path)
Questa tecnica vi permetterà di riutilizzare questo script regression.py in più progetti. È sufficiente che mettiate lo script in una directory comune e poi anche nella directory del progetto prima di lanciarlo. Tutti quei test delle unità di codice del progetto saranno trovati e provati, invece di quelli ubicati nella directory comune dove si trova regression.py.
<< Programmazione orientata ai dati |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
Filtrare liste rivisitate >> |